[OpenGL] กลม ๆ หมุน ๆ

ห่างหายไปนานกับ Entry ว่าด้วยเรื่องของ OpenGL

จากคราวที่แล้ว ที่บอกว่าจะมาสอนวาดวงกลมนั้นขอข้ามไปก่อนละกันครับ

ขอเป็นวาด ทรงกลม เลยละกัน

(Entry นี้อาจจะเมา ๆ นะครับ เขียนตอนตี 2 หลังทำการบ้าน CG เสร็จ(แต่ไม่สมบูรณ์))

เริ่มที่ Header ก่อนเลยครับ

#include <stdio.h>
#include <GL/glut.h>
GLUquadricObj *theObj;
int i;

ที่เพิ่มเติมเข้ามาก็คือ GLUquadricObj *theObject นั่นก็เพื่อประกาศตัวแปรประเภท Quadric ชื่อ theObject

void init()
{
    glEnable(GL_DEPTH_TEST);
    glClearColor(0.0,0.0,0.0,0.0);
    theObj = gluNewQuadric();
}

ส่วนนี้ที่เพิ่มเติมมาก็คือ theObj = gluNewQuadric(); เพื่อสร้าง Object ประเภท Quadric ให้ theObject

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
    gluQuadricDrawStyle(theObj,GLU_LINE);
    glRotatef(++i%360,1.0,1.0,0.0);
    gluSphere(theObj,20.0,50,20);
    glPopMatrix();
    glutSwapBuffers();
}

อธิบายทีละคำสั่งแล้วกัน

glPushMatrix(); ใช้เพื่อคัดลอก Matrix ลง Stack

gluQuadricDrawStyle(theObj,GLU_LINE); ใช้กำหนดลักษณะการวาด โดย Parameter แรก คือ Object ที่ต้องการกำหนด Parameter ที่สองคือลักษณะที่ต้องการวาด โดยสามารถเลือกได้ทั้ง GLU_LINE ที่วาดเป็นเส้น GLU_FILL วาดเป็นทรงทึบ และ GLU_POINT วาดเป็นจุด

glRotatef(++i%360,1.0,1.0,0.0); ทำให้มันหมุนทวนเข็มนาฬิกา โดย Parameter แรกคือมุมที่ต้องการให้หมุน(หน่วยเป็น องศา) Parameter ที่ 2 3 4 คือ x y z โดยอยากให้หมุนรอบแกนไหนก็ใส่เป็น 1.0 แต่ถ้าใส่ 0.0 จะไม่หมุน

gluSphere(theObj,20.0,50,20); สร้างรูปทรงกลม โดยใน OpenGL นั้นรูปทรงแบบ Quadric จะมีด้วยกันทั้งหมด 3 แบบ ได้แก่ Sphere, Cylinder และ Disk ซึ่งในการสร้างรูปทรงแต่ละแบบนั้นก็จะมี Parameter ในการสร้างต่างกันไป ดังนี้

  • Sphere ทรงกลม นั้น Parameter แต่ละตัวคือ Object ที่จะสร้าง, รัศมี, จำนวนเส้นแนวนอน, จำนวนเส้นแนวตั้ง ตามลำดับ
  • Cylinder ทรงกรวย จะมี Parameter 6 ตัวคือ Object ที่จะสร้าง , รัศมีที่ฐาน, รัศมีที่ยอด, ส่วนสูง, จำนวนเส้นนอน,จำนวนเส้นแนวตั้ง
  • และสุดท้าย Disk เป็นจาน Parameter มี 5 ตัวคือ Object ที่จะสร้าง, รัศมีวงใน, รัศมีวงนอก, จำนวนเส้น, จำนวนวง

 

glPopMatrix(); นำ Matrix ออกจาก Stack

glutSwapBuffers(); เป็นคำสั่งที่นำสิ่งที่วาดไว้ออกมาแสดงบนหน้าจอ

void reshape(int w,int h)
{
    glViewport(0,0,w,h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(w<=h && w>0)
        glOrtho(-SIZEW,SIZEW,(GLdouble)-h/w*SIZEW,(GLdouble)h/w*SIZEW,0.0,3*SIZEW);
    else
        glOrtho((GLdouble)-w/h*SIZEW,(GLdouble)w/h*SIZEW,-SIZEW,SIZEW,0.0,3*SIZEW);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0.0,0.0,-SIZEW);
}

ส่วนนี้ไม่รู้จะอธิบายยังไง ลอกเขามา…(ขอโทษด้วย)

int main(int argc, char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowPosition(100,100);
    glutInitWindowSize(400,400);
    glutCreateWindow("Tranformation");

    init();
    glutReshapeFunc(reshape);
    glutDisplayFunc(display1);
    glutIdleFunc(display1);
    glutMainLoop();
}

เมื่อลอง Run ดูก็จะได้รูปทรงกลมอันนึงหมุนติ้ว ๆ

ปล.ไม่ได้ลองรันดูนะครับ ผิดพลาดประการไดก็ขอโทษด้วย

ปล.2 ใครรันไม่ผ่าน ติดตรงไหนก็บอกด้วยนะครับ จะได้แก้ไขให้

ปล.3 uou~

ปล.4 Tag Entry นี้เวิ่นเว้อจังเฮ้ย…

Comments

  1. tan

    >—— Build started: Project: cycle, Configuration: Debug Win32 ——
    1>Compiling…
    1>cycle.cpp
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(26) : error C2065: ‘amp’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(26) : warning C4554: ‘&’ : check operator precedence for possible error; use parentheses to clarify precedence
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(26) : error C2143: syntax error : missing ‘)’ before ‘;’
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(26) : warning C4390: ‘;’ : empty controlled statement found; is this the intent?
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(26) : error C2065: ‘amp’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(26) : error C2059: syntax error : ‘)’
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(27) : error C2146: syntax error : missing ‘;’ before identifier ‘glOrtho’
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(27) : warning C4552: ‘>’ : operator has no effect; expected operator with side-effect
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(27) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(27) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(27) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(27) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(27) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(28) : error C2181: illegal else without matching if
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(29) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(29) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(29) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(29) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(29) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(32) : error C2065: ‘SIZEW’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(36) : error C2065: ‘amp’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(36) : error C2143: syntax error : missing ‘)’ before ‘;’
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(36) : error C2059: syntax error : ‘)’
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(44) : error C2065: ‘display1’ : undeclared identifier
    1>c:\documents and settings\pawana.p\my documents\visual studio 2008\projects\cycle\cycle\cycle.cpp(45) : error C2065: ‘display1’ : undeclared identifier
    1>Build log was saved at “file://c:\Documents and Settings\pawana.p\My Documents\Visual Studio 2008\Projects\cycle\cycle\Debug\BuildLog.htm”
    1>cycle – 22 error(s), 3 warning(s)
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

  2. Post
    Author
    JiJaKuNg

    amp แก้แล้วนะครับ

    แต่พวก SIZEW อะไรพวกนี้ต้องกำหนดขึ้นมาเองนะครับ…ขอโทษด้วย

Leave a Reply