2020年4月7日 星期二

Week06-階層性移動、階層性轉動

W06-1---複習上周程式碼Light


打開OpenGL
修改、刪減原程式碼,幫茶壺打光

W06-2---用鍵盤操控茶壺移動或旋轉


 讓茶壺能像MAYA一樣用鍵盤
按 ' E ' 時旋轉、按 ' W ' 時可以用滑鼠移動位置

宣告當type是1時旋轉、是2時移動 (一開始就可以璇轉) 寫在motion裡面
改變mouse新的位置,設定轉動、移動的變數

push備份矩陣,移動、旋轉,pop輸出矩陣 
translate的y要加負號,rotate向y軸旋轉 ' -1 ' 相反
在keyboard裡面設定操控按鍵 ' E ' 跟 ' W ' 

 在main裡面放display,mouse,motion,keyboard函式才能運作

程式碼由下往上看~~
把一台旋轉中變瘦的車子移到右邊




~程式碼~#include <GL/glut.h>const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat light_position[] = { 2.0f, 5.0f, -5.0f, 0.0f };const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };const GLfloat high_shininess[] = { 100.0f };
int type=1;///TODO2-1: 1:rotate 2:translatefloat teapotX=0, teapotY=0;float teapotRotY=0;///轉動的變數int oldX=0, oldY=0;void mouse(int button, int state, int x, int y){///TODO1:mouse 要可以移動teapot///TODO1-1:按下去    oldX=x;    oldY=y;}void motion(int x, int y)///TODO1-2:motion 動{    if(type==1){        teapotRotY += x-oldX;    }else if(type==2){        teapotX += x-oldX;        teapotY += y-oldY;    }    oldX=x;    oldY=y;    glutPostRedisplay();///TODO1:更新畫面}
void display(){    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);    glPushMatrix();///TODO1        glTranslatef( teapotX/250.0, -teapotY/250.0, 0);        glRotatef(teapotRotY, 0, -1, 0);        glutSolidTeapot(0.3);    glPopMatrix();///TODO1    glutSwapBuffers();}#include <stdio.h>void keyboard(unsigned char key, int x, int y){    if(key=='e' || key=='E' ) type=1;    if(key=='w' || key=='W' ) type=2;    printf("now:%c\n",key);}int main(int argc, char *argv[]){    glutInit(&argc, argv);    glutInitWindowSize(500,500);    glutInitWindowPosition(10,10);    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);    glutCreateWindow("GLUT Shapes");
    glutDisplayFunc(display);    glutMouseFunc(mouse);    glutMotionFunc(motion);    glutKeyboardFunc(keyboard);    glutIdleFunc(display);
    glEnable(GL_DEPTH_TEST);    glEnable(GL_LIGHT0);    glEnable(GL_NORMALIZE);    glEnable(GL_COLOR_MATERIAL);    glEnable(GL_LIGHTING);
    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);    glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);    glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);    glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);    glutMainLoop();
    glutMainLoop();    return EXIT_SUCCESS;}



沒有留言:

張貼留言