之前的課程都是二維(x,y),現在多了z軸,變成三維
glRotate(旋轉角度,X,Y,Z)
正值:順時鐘 負值:逆時鐘
XYZ負值會反轉上面的規則
先寫程式看看
預設程式是自動旋轉,我們改成滑鼠操控
先float mya(我的角度)
用glutMotionFunc()來開啟滑鼠程式
自己 void getmya(int x,int y) 來抓你的x,再將x套用到mya
glRotated(a,0,0,1); 中的a是旋轉角度,用mya來替換(const double a = mya;)
用茶壺程式自己寫
#include<GL/glut.h>
float mya=0;
void a()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glRotated(mya,0,0,1);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
void m(int x,int y)
{
mya=x;
a();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week03");
glutMotionFunc(m);
glutDisplayFunc(a);
glutMainLoop();
}
但是他的轉動每次都會重新指定x,不會根據滑鼠現在的位子移動
所以我們要優化
#include<GL/glut.h>
float mya=0;
void a()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotated(mya,0,0,1);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
int nowx=0;
void mouse(int b,int s,int x,int y)
{
if(s==GLUT_DOWN) nowx=x;
}
void m(int oldx,int y)
{
mya+=(oldx-nowx);
nowx=oldx;
a();
}
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
glutCreateWindow("week03");
glutMotionFunc(m);
glutMouseFunc(mouse);
glutDisplayFunc(a);
glutMainLoop();
}
加入滑鼠程式mouse用來記錄滑鼠當前的x,將它記錄做nowx,而Motion函式m中的x作為oldx





沒有留言:
張貼留言