Week05:移動、旋轉、縮放、矩陣
範例 http://jsyeh.org/3dcg10
1. 下載網頁中的data, win32
2. 將windows解壓縮, data.zip/data丟進解壓縮後的windows資料夾1.使用先前的茶壺程式碼,加上keyboard函式並利用printf()印出執行的動作
```
```
#include <stdio.h>///印出用
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glColor3f(1, 1, 0);
glutSolidTeapot(0.3);
glutSwapBuffers();
}
void keyboard( unsigned char key, int x, int y )
{
printf("你按下了%c在 %d %d座標\n", key, x, y);
}
int main(int argc, char** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤事件函式
glutMainLoop();
}
```
2-1.加上先前教過的Motion與Mouse函式
```
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=0, y=0, z=0;
int oldX=0, oldY=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
glColor3f(1, 1, 0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void mouse(int button, int state, int mouseX, int mouseY)
{
}
void motion(int mouseX, int mouseY)
{
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤事件函式
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
```2-2.在Motion拖曳函式中加上參式與重設座標的公式
```
void motion(int mouseX, int mouseY)
{
x +=(mouseX-oldX);
y +=(mouseY-oldY);
oldX = mouseX;
oldY = mouseY;
display();
}
```2-3.在 mouse函式中設置錨點,去除圖形瞬移的錯誤
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=150, y=150, z=0;///座標設定為150, 150在視窗正中央
int oldX=0, oldY=0;
void display()
{
glClearColor(0.5, 0.5, 0.5, 1);///灰色背景R,G,B,A 其中A為半透明Alpha值
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備分矩陣
glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
glColor3f(1, 1, 0);
glutSolidTeapot(0.3);
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
void mouse(int button, int state, int mouseX, int mouseY)
{///設置錨點,避免瞬間移動的問題
oldX = mouseX; oldY = mouseY;
}
void motion(int mouseX, int mouseY)
{
x +=(mouseX-oldX);
y +=(mouseY-oldY);
oldX = mouseX;
oldY = mouseY;
display();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤事件函式
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
```
縮放函式glScalef()
3.加上縮放函式,在motion函式中改寫公式
```
#include <stdio.h>///印出用
#include <GL/glut.h>
float x=150, y=150, z=0, scale=1.0;///座標設定為150, 150在視窗正中央
int oldX=0, oldY=0;
void display()
{
glClearColor(0.5, 0.5, 0.5, 1);///灰色背景R,G,B,A 其中A為半透明Alpha值
glClear(GL_COLOR_BUFFER_BIT |GL_DEPTH_BUFFER_BIT);
glPushMatrix();///備分矩陣
glTranslatef((x-150)/150.0, -(y-150)/150.0, z);
glScalef(scale, scale, scale);///x,y,z縮放為 scale倍,維持原有比例
glColor3f(1, 1, 0);
glutSolidTeapot(0.3);
glPopMatrix();///還原矩陣
glutSwapBuffers();
}
void mouse(int button, int state, int mouseX, int mouseY)
{///重設圖案位置,避免瞬間移動的問題
oldX = mouseX; oldY = mouseY;
}
void motion(int mouseX, int mouseY)
{
if(mouseX-oldX >0) scale *=1.01;
if(mouseX-oldX <0) scale -=0.99;///+-百分之一
oldX = mouseX;
oldY = mouseY;
display();
}
void keyboard( unsigned char key, int mouseX, int mouseY )
{
}
int main(int argc, char** argv)
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week05 keyboard");
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);///鍵盤事件函式
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutMainLoop();
}
```
未完待續...
沒有留言:
張貼留言