2021年3月31日 星期三

Xian筆記-Week06


Week06

(1)主題:特定軸轉定 T-R-T

(2)主題:階層性轉動

補充一下:圖學OpenGL教學資源 >> 120.125.80.50/GL


(1)主題:特定軸轉定 T-R-T

1.Angle++; 自動轉動!!!



#include<GL/glut.h> float angle=0; ///TODO: void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();
glRotatef(angle, 0,0,1);
glutSolidCube(1); ///TODO: glPopMatrix(); glutSwapBuffers();
angle++; ///TODO:
} int main(int argc, char ** argv) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("07361092"); glutDisplayFunc(display); glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!! }

2.拆解程式、理解程式!!!






#include<GL/glut.h> float angle=0; ///TODO: void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix();
glRotatef(angle, 0,0,1); ///對中心轉動 glScalef(0.5, 0.1, 0.1); ///細長的 glColor3f(0,0,1); ///藍色的 glutSolidCube(1); ///方塊
    




    glPopMatrix(); glutSwapBuffers(); angle++; ///TODO: } int main(int argc, char ** argv) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("07361092"); glutDisplayFunc(display); glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!! glutMainLoop(); }



























3.把關節點移到中心,再去旋轉!!!

#include<GL/glut.h> float angle=0; ///TODO: void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(angle, 0,0,1); ///對中心轉動
glTranslatef(0.25 ,0 ,0); ///把關節移到中心
        glScalef(0.5, 0.1, 0.1); ///細長的 glColor3f(0,0,1); ///藍色的 glutSolidCube(1); ///方塊 glPopMatrix(); glutSwapBuffers(); angle++; ///TODO: } int main(int argc, char ** argv) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("07361092"); glutDisplayFunc(display); glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!! glutMainLoop(); }
























4.整理一下程式碼,把關節移到中心,再把整個物件移到右上角,再去旋轉!!!




#include<GL/glut.h> float angle=0; ///TODO: void hand()
{ glPushMatrix(); glScalef(0.5, 0.1, 0.1); ///細長的 glColor3f(0,0,1); ///藍色的 glutSolidCube(1); ///方塊 glPopMatrix(); }

void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1); glutSolidCube(1);///畫個方塊當對照 glPushMatrix();
glTranslatef(0.5, 0.5, 0); ///(3)整個移到右上角掛著
        glRotatef(angle, 0,0,1); ///(2)對中心轉動 glTranslatef(0.25 ,0 ,0); ///(1)把關節移到中心 hand();///呼叫那個細長的藍色的小手手 glPopMatrix(); glutSwapBuffers(); angle++; ///TODO: } int main(int argc, char ** argv) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("07361092"); glutDisplayFunc(display); glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!! glutMainLoop(); }































(2)主題:階層性轉動
    glPushMatrix();
        ...
        glPushMatrix();
          ...
        glPopMatrix();
      glPopMatrix();
  
    Ex:機器人手臂

1.多加一層階層!!!!


#include<GL/glut.h> float angle=0; ///TODO: void hand() { glPushMatrix();///每個地方都要加,怕出錯 glScalef(0.5, 0.1, 0.1); ///細長的 glColor3f(0,0,1); ///藍色的 glutSolidCube(1); ///方塊 glPopMatrix(); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1); glutSolidCube(0.5);///畫個方塊當對照 glPushMatrix(); glTranslatef(0.25, 0.25, 0); ///(3)整個移到右上角掛著 glRotatef(angle, 0,0,1); ///(2)對中心轉動 glTranslatef(0.25 ,0 ,0); ///(1)把關節移到中心 hand();///呼叫那個細長的藍色的小手手當上手臂 glPushMatrix(); glTranslatef(0.25, 0, 0); ///(3)往右移 glRotatef(angle, 0,0,1); ///(2) glTranslatef(0.25 ,0 ,0); ///(1) hand();///呼叫那個細長的藍色的小手手當下手臂 glPopMatrix(); glPopMatrix(); glutSwapBuffers(); angle++; ///TODO: } int main(int argc, char ** argv) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("07361092"); glutDisplayFunc(display); glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!! glutMainLoop(); }




































2.多做個左邊!!



#include<GL/glut.h> float angle=0; ///TODO: void hand() { glPushMatrix();///每個地方都要加,怕出錯 glScalef(0.5, 0.1, 0.1); ///細長的 glColor3f(0,0,1); ///藍色的 glutSolidCube(1); ///方塊 glPopMatrix(); } void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glColor3f(1,1,1); glutSolidCube(0.5);///畫個方塊當對照 glPushMatrix();///右半邊 glTranslatef(0.25, 0.25, 0); ///(3)整個移到右上角掛著 glRotatef(angle, 0,0,1); ///(2)對中心轉動 glTranslatef(0.25 ,0 ,0); ///(1)把關節移到中心 hand();///呼叫那個細長的藍色的小手手當上手臂 glPushMatrix(); glTranslatef(0.25, 0, 0); ///(3)往右移 glRotatef(angle, 0,0,1); ///(2) glTranslatef(0.25 ,0 ,0); ///(1) hand();///呼叫那個細長的藍色的小手手當下手臂 glPopMatrix(); glPopMatrix(); glPushMatrix();///左半邊 glTranslatef(-0.25, 0.25, 0); ///(3)整個移到左上角掛著 glRotatef(-angle, 0,0,1); ///(2)對中心轉動 glTranslatef(-0.25 ,0 ,0); ///(1)把關節移到中心
hand();///呼叫那個細長的藍色的小手手當上手臂 glPushMatrix(); glTranslatef(-0.25, 0, 0); ///(3)往左移 glRotatef(-angle, 0,0,1); ///(2) glTranslatef(-0.25 ,0 ,0); ///(1) hand();///呼叫那個細長的藍色的小手手當下手臂 glPopMatrix(); glPopMatrix(); glutSwapBuffers(); angle++; ///TODO: } int main(int argc, char ** argv) { glutInit( &argc, argv ); glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH); glutCreateWindow("07361092"); glutDisplayFunc(display); glutIdleFunc(display); ///TODO: 閒閒有空時,就重畫畫面!! glutMainLoop(); }





























































沒有留言:

張貼留言

距地表面160 Week11

 #include "glm.h" GLMmodel* pmodel = NULL; void drawmodel(void) {     if (!pmodel) { pmodel = glmReadOBJ("data/porsche.obj...