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;}
沒有留言:
張貼留言