課堂範例
一.
1.先去老師提供的網址: https://jsyeh.org/3dcg10/,下載data和win32的檔案
2.將下載好的壓縮檔data.zip和windows.zip進行解壓縮(data和windows為解壓縮過後的檔案)
4.點開Transformation.exe(注意data資料夾是否有放入windows資料夾裡面,這樣才能開啟視窗)
二.矩陣的備份和還原
1.建立一個GLUT檔案(記得之前freeglut裡面的檔案libglut32.a要設定好喔,否則會無法開啟),並命名為week04_translate
如果圖片每拖曳一次視窗就會移動怎麼辦?(像是設定成glTranslatef(0.3,0.2,0),每拖曳一次視窗,裡面的紅色茶壺就會往0.3,0.2,也就是右上角的方向移動耶)
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.3,0.2,0);///右上角
glColor3f(1,0,0);///紅色
glutSolidTeapot(0.3);///0.3實心茶壺
glutSwapBuffers();///交換兩倍的buffer
}
int main(int argc,char**argv)
{///進階的main函式
glutInit(&argc, argv);///初始化
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
glutCreateWindow("HW2 bonus");///建立視窗
glutDisplayFunc(display);///用來畫圖的函式
glutMainLoop();///主要的迴圈
return 0;
}
(可以看見明顯的移動痕跡)
可是我們不想要移動圖片,所以要進行矩陣的備份和還原喔
在開頭先設定備份矩陣glPushMatrix();
然後在結束前在放一個還原矩陣glPopMatrix();
這樣子只要移動視窗的話,茶壺也就不會亂跑了喔
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///push備份矩陣
glTranslatef(0.3,0.2,0);///右上角
///就不會一直偷偷移動,因為移動會累積
glColor3f(1,0,0);///紅色
glutSolidTeapot(0.3);///0.3實心茶壺
glPopMatrix();///pop還原矩陣
glutSwapBuffers();///交換兩倍的buffer
}
int main(int argc,char**argv)
{///進階的main函式
glutInit(&argc, argv);///初始化
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
glutCreateWindow("HW2 bonus");///建立視窗
glutDisplayFunc(display);///用來畫圖的函式
glutMainLoop();///主要的迴圈
return 0;
}
2.如果想要四個視窗都擺放茶壺要怎麼做呢?
我們要先設定茶壺茶壺的座標值(myTeapot(float x,float y)那一段),並使用備份矩陣和還原矩陣以避免茶壺亂跑
而要展示出來的茶壺(display()會印出來)
可以先設定茶壺顏色glColor3f()
然後要印出來的茶壺(x座標,y座標)ex:myTeapot(+0.5,+0.5);
寫了四個myTeapot(x,y),所以會有四個茶壺
#include <GL/glut.h>
void myTeapot(float x,float y)
{
glPushMatrix();///push備份矩陣
glTranslatef(x,y,0);
glutSolidTeapot(0.3);///0.3實心茶壺
glPopMatrix();///pop還原矩陣
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);///紅色
myTeapot(+0.5,+0.5);
myTeapot(+0.5,-0.5);
myTeapot(-0.5,-0.5);
myTeapot(-0.5,+0.5);
glutSwapBuffers();
}
int main(int argc,char**argv)
{///進階的main函式
glutInit(&argc, argv);///初始化
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
glutCreateWindow("HW2 bonus");///建立視窗
glutDisplayFunc(display);///用來畫圖的函式
glutMainLoop();///主要的迴圈
return 0;
}
三.mouse滑鼠設定
#include <GL/glut.h>
#include <stdio.h>///printf()
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSwapBuffers();///交換兩倍的buffer
}
void mouse(int button,int state,int x,int y)
{
printf("%d %d %d %d\n",button,state,x,y);
}
int main(int argc,char**argv)
{///進階的main函式
glutInit(&argc, argv);///初始化
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
glutCreateWindow("week04 mouse");///建立視窗
glutDisplayFunc(display);///用來畫圖的函式
glutMouseFunc(mouse);///mouse滑鼠
glutMainLoop();///主要的迴圈
return 0;
}
#include <GL/glut.h>
#include <stdio.h>///printf()
int mouseX=0,mouseY=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,0);///黃色的
glPushMatrix();///口訣:減一半、除一半、y還倒過來
glTranslatef((mouseX-150)/150.0,-(mouseY-150)/150.0,0);
glutSolidTeapot(0.3);///茶壺
glPopMatrix();
glutSwapBuffers();
}
void mouse(int button,int state,int x,int y)
{
//printf("%d %d %d %d\n",button,state,x,y);
mouseX=x; mouseY=y;
}
int main(int argc,char**argv)
{///進階的main函式
glutInit(&argc, argv);///初始化
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
glutCreateWindow("week04 mouse");///建立視窗
glutDisplayFunc(display);///用來畫圖的函式
glutMouseFunc(mouse);///mouse滑鼠
glutMainLoop();///主要的迴圈
return 0;
}
#include <GL/glut.h>
#include <stdio.h>///printf()
int mouseX=0,mouseY=0,N=0;///N個點
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)
{///進階的main函式
glutInit(&argc, argv);///初始化
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);///2倍+3D
glutCreateWindow("week04 mouse");///建立視窗
glutDisplayFunc(display);///display顯示
glutMouseFunc(mouse);///mouse滑鼠
glutMainLoop();///主要的迴圈
return 0;
}
沒有留言:
張貼留言