到老師的網站(http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/),將Windows、data、glut32.dll下載下來,並解壓縮放在桌面。
解壓縮後,將data、glut32.dll放到Windows資料夾裡。
Transformation的畫面 |
打開Windows資料夾,執行Transformation,畫面中有glTranslatef、glRotatef、glScalef、glBeing,分別是移動、旋轉、縮放大小、開始的程式碼。
用CodeBlocks產生GLUT project。
將GLUT project的程式碼,將多餘的程式碼刪掉,改寫成上週教的畫茶壺的程式碼。
程式碼如下:
#include <GL/glut.h>
static void display(void)
{
glutSolidTeapot(0.3);~~~畫茶壺。
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMainLoop();
}
移動的茶壺 |
在原本的程式碼中的display函式中加入0程式碼,茶壺就能移動了。
以下是程式碼:(多加入的用紅色顯示)
#include <GL/glut.h>
#include <stdlib.h>
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);~~~移除之前的顏色,移除之前的深度
glPushMatrix();~~~備份矩陣
glTranslatef(0.5,0,0);~~~移動~~~括號部分是按順序代表X軸、Y軸、Z軸
glutSolidTeapot(0.3);
glPopMatrix();~~~還原矩陣
glutSwapBuffers();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMainLoop();
}
右邊是平面系統座標、左邊是滑鼠座標 |
這張圖是為了讓我們了解兩個座標之間的差異,進而讓大家能更好去了解平面座標是怎麼去轉換成滑鼠座標。
滑鼠茶壺移動 |
這個移動方法跟剛剛移動的茶壺是不一樣的,前面那種是在一開始顯示就在我們程式碼設定好的座標,而後面這種是我們用滑鼠按著圖片,就能移動到視窗上的任何座標。
以下是程式碼:(多加入的用紅色顯示)
float mouseX=0,mouseY=0;~~~宣告mouseX、mouseY,來當滑鼠的X、Y座標
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(mouseX,mouseY,0);~~~移動~~~括號部分是按順序代表X軸、Y軸、Z軸~~~將原本的數字改成變數,這樣移動就能隨著滑鼠的座標移動而改變。
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x, int y)~~~設motion函式
{
mouseX=(x-150)/150.0;~~~由平面X軸轉換成滑鼠X軸
mouseY=-(y-150)/150.0;~~~由平面Y軸轉換成滑鼠Y軸
glutPostRedisplay();~~~用來重新顯示(整理)motion的程式,讓滑鼠的點擊函式(motion)能順利執行顯示。
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMotionFunc(motion);~~~用來呼叫滑鼠點擊的函式
glutMainLoop();
}
一開始程式執行的樣子,此時茶壺大小(0.0.0) |
滑鼠按住移動,大小改變 |
這是改變茶壺的大小,把原本的dispaly函式,刪除glTranslatef,加入glScalef,而茶壺的大小一開始是沒有的,只要按著滑鼠在視窗內移動,茶壺的大小就會隨著座標跟著改變。
float mouseX=0,mouseY=0;
static void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glScalef(mouseX,mouseY,0);~~~改變大小~~~括號部分是按順序代表X軸、Y軸、Z軸~~~茶壺改變的大小會隨著滑鼠的座標移動而改變。
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
void motion(int x, int y)
{
mouseX=(x-150)/150.0;
mouseY=-(y-150)/150.0;
glutPostRedisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutMotionFunc(motion);
glutMainLoop();
}
沒有留言:
張貼留言