打開transformation.exe,裡面的數值可以調整攝影機的狀態。
紅色範圍內點右鍵可以切換角色。
本週的重點是rotate。
新增一個OpenGL專案,將main.cpp的程式碼全刪掉,換成以下的:
#include <GL/glut.h>
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(180,0,0,1);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week05_1");
glutDisplayFunc( display );
glutMainLoop();
return 0;
}
幾乎是上週的東西,只不過重點在這裡:
加入滑鼠的程式,就可以讓茶壺隨著滑鼠選轉(目前是依照滑鼠的X數值)
有了angle,glRotatef(angle,0,0,1)這行就可以讓茶壺360轉動了。
#include <GL/glut.h>
int angle;
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x,int y)
{
angle=x;
display();
}
int main(int argc, char**argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week05_1");
glutDisplayFunc( display );
glutMotionFunc(motion);
glutMainLoop();
return 0;
}
雖然說可以360度旋轉,但是要找相對應的座標也太需要精準度了...感覺有點麻煩。不妨試試看用向量,讓轉動更順暢?
#include <GL/glut.h>
int angle, oldX=0;
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle,0,0,1);
glColor3f(1,1,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void mouse(int button, int state, int x,int y){
oldX=x;
}
void motion(int x,int y)
{
angle+=(x-oldX);
oldX=x;
display();
}
int main(int argc, char**argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week05_1");
glutDisplayFunc( display );
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
return 0;
}
新增的變數oldX為累積量,會根據上次的位置計算出茶壺要轉動的角度。
例: X50>X100 =轉50度 X-20>X70 =轉90度
今天放學前還寫了多邊形的程式,也許是下週用的?
#include <GL/glut.h>
int N=0;
int x[1000],y[1000];
void display()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
for(int i=0;i<N;i++){
glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0);
}
glEnd();
glutSwapBuffers();
}
void mouse(int button, int state, int mouseX,int mouseY){
if(state==GLUT_DOWN){
N++;
x[N-1]=mouseX;
y[N-1]=mouseY;
}
display();
}
int main(int argc, char**argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week05_1");
glutDisplayFunc( display );
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
沒有留言:
張貼留言