1下載windows.zip 以及data.zip
1.1到 https://jsyeh.org/3dcg10/ 05/04 examples:裡下載 "win32","data"
2.開啟Transformation.exe
2.1解壓縮windows.zip 以及 data.zip.
2.2把data.zip 丟到 windows 資料夾裡面.
2.3開啟Transformation.exe.
3.用glut做茶壺
開啟glut後 把打出下列程式碼:
****glPushMatrix();備份matrix.
****glutTranslatef(x,y,0) 每更新一次就移動一次x、y
****glPopMatrix(); 跳出備份之matrix.
#include <GL/glut.h>
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(0.2,0.1,0);
glColor3f(1,0,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week04的視窗");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
多重茶壺
把glPushMatrix() 到 glPopMatrix() 移動到 新加的void小程式裡 再把 x,y 引入glTranslatef()裡.
再把 myTeapot() 引入到 display內.
#include <GL/glut.h>
void myTeapot(float x,float y){
glPushMatrix();
glTranslatef(x,y,0);
glColor3f(1,0,0);
glutSolidTeapot(0.3);
glPopMatrix();
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
myTeapot(0.5,0.4);
myTeapot(0.5,-0.4);
myTeapot(-0.5,-0.4);
myTeapot(-0.5,0.4);
glutSwapBuffers();
}
int main(int argc, char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week04的視窗");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
4.滑鼠事件的應用
使用下列程式碼
****新增一個void mouse 函數, 當呼叫時引入並輸出
1.滑鼠的使用鍵位 button(0左鍵/1中鍵/2右鍵)
2.鍵位的使用狀態 state(0按下,1放開)
3.滑鼠的位置x,y
****glutMouseFunc(mouse) 滑鼠事件 引入mouse函數.
形式為 void glutMouseFunc(void (*func)(int button, int state,int x, int y));
#include <GL/glut.h>
#include <stdio.h>
void mouse(int button,int state,int x,int y){
printf("%d %d %d %d\n",button,state,x,y);
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSwapBuffers();
}
int main(int argc, char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week04的視窗");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
滑鼠事件的應用二-利用滑鼠移動茶壺
使用下列程式碼:
****glTranslatef((mouseX-150)/150.0,-(mouseY-150)/150.0,0); 對於translatef來說(0,0)是mouse事件內的(150,150),轉換方式即為(mouseX-150)/150.0,-(mouseY-150)/150.0
#include <GL/glut.h>
#include <stdio.h>
int mouseX=0,mouseY=0;
void mouse(int button,int state,int x,int y){
mouseX =x;mouseY=y; //將mouse事件的 x,y 引入 mouseX,mouseY內
}
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
glPushMatrix();
glTranslatef((mouseX-150)/150.0,-(mouseY-150)/150.0,0);
glutSolidTeapot(0.3);
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week04的視窗");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
滑鼠事件的應用三-利用滑鼠畫圖
#include <GL/glut.h>
#include <stdio.h>
int mouseX=0,mouseY=0,N=0;
int mx[100],my[100];
void display(){
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,0);
glBegin(GL_LINE_LOOP);
for(int i=0;i<N;i++){
glVertex2f((mx[i]-150)/150.0,-(my[i]-150)/150.0);
}
glEnd();
glutSwapBuffers();
}
void mouse(int button,int state,int x,int y){
mouseX=x;mouseY=y;
if(state==GLUT_DOWN){
printf(" glVertex2f( {%d-150}/150.0,-(%d-150)/150.0 );\n",x,y);
N++;
mx[N-1]=x;my[N-1]=y;
}
}
int main(int argc, char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("week04 mouse");
glutDisplayFunc(display);
glutMouseFunc(mouse);
glutMainLoop();
return 0;
}
沒有留言:
張貼留言