- 課堂範例: https://jsyeh.org/3dcg10/
2. 解壓縮後,將data資料夾移至window資料夾中
3. 點開 Transformation.exe 即可操作
- Rotation (旋轉)
1. 利用 安培右手定則 來判斷旋轉的位置
3. 利用glRotatef(角度, x, y, z)來進行旋轉4. 移動 y 軸 中心點從身體下面穿至上面,左右旋轉
5.移動 y 軸 中心點從身體肚子前面穿至後面 ,面對你旋轉
6.有可一次移動多項 讓其隨意轉動
6.有可一次移動多項 讓其隨意轉動
- Rotation (旋轉) 實作
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(180, 0, 0, 1);
glColor3f(1, 0, 0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("Rotate");
glutDisplayFunc(display);
glutMainLoop();
}
- 用滑鼠旋轉
#include <GL/glut.h>
float angle= 0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0, 0, 1);
glColor3f(1, 0, 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("Rotate");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
- 用滑鼠旋轉 (修正問題)
#include <GL/glut.h>
float angle= 0, oldX= 0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glRotatef(angle, 0, 0, 1);
glColor3f(1, 0, 0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void mouse(int botton, 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("Rotate");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
- 用滑鼠畫圖 (複習)
- 用滑鼠拖曳畫圖
#include <stdio.h>
#include <GL/glut.h>
int N=0; ///一開始沒有任何頂點
int x[1000], y[1000]; ///最多1000個頂點
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glBegin(GL_LINE_LOOP);
for(int i=0; i<N; i++){ ///用迴圈 畫N個頂點
glVertex2f( (x[i]-150)/150.0, -(y[i]-150)/150.0);
} ///口訣: 減一半、除一半 y要加負號
glEnd();
glutSwapBuffers();
}
void motion(int mouseX, int mouseY)
{
N++; ///多一個頂點
x[N-1] = mouseX; ///最後一個新增之頂點x座標
y[N-1] = mouseY; ///最後一個新增之頂點y座標
printf("按下滑鼠,得到新座標 %d %d\n", x[N-1], y[N-1]);
display();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("mouse");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}

沒有留言:
張貼留言