# Week05
今日上課內容:
主題一:
1.打開今天的上課範例,網址:http://jsyeh.org/3dcg10
下載data.zip/解壓縮/data資料夾放進windows資料夾裡
下載win32.zip/解壓縮/打開Transformation.exe即可
範例使用說明:右上角模型框框/滑鼠按右鍵可以換模型
下方調整glRotate的數值:(角度,x,y,z)
2.利用範例練習-四個動作:
2-1.X軸(1,0,0):
(正值,1,0,0):竹籤躺平在中間,箭頭朝右。旋轉結果如下:
2-3.Z軸(0,0,1):
3.程式碼實作:我們利用上周基本的程式碼,插入glRotatef(角度,x,y,z)函式來轉動黃色茶壺。
程式碼如下:
```C++
#include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix(); glRotatef(180,0,0,1); glColor3f(1,1,0); glutSolidTeapot(0.3); glPopMatrix(); glutSwapBuffers(); } int main(int argc,char**argv) { glutInit(&argc,argv); glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH ); glutCreateWindow("week05 Rotate"); glutDisplayFunc( display ); glutMainLoop(); return 0; }
```
4.程式碼實作:改良上一個程式碼,加入mouse互動,利用glutMotionFunc(),移動滑鼠,茶壺會跟著滑鼠的角度旋轉
程式碼如下:
```C++
#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,1,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("week05 mouse Motion"); glutDisplayFunc( display ); glutMotionFunc(motion); glutMainLoop(); }
```
5.程式碼實作:上一個程式,雖然看起來有在轉,但其實不是正確的,以上一個程式加上
glutMouseFunc(mouse);函式去改良
程式碼如下:
```C++
#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,1,0); glutSolidTeapot(0.3); glPopMatrix(); glutSwapBuffers(); } void mouse(int button,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("week05 mouse Motion"); glutDisplayFunc( display ); glutMouseFunc(mouse); glutMotionFunc(motion); glutMainLoop(); }
```
第三節:
1.複習mouse程式&GL_LINE_LOOP
程式碼一:利用滑鼠點擊的點,把線連起來,製作圖案,並找到座標位子。
```C++
程式碼二:把上一個程式延伸,把Mouse函式改成Motion函式,可以利用滑鼠連續畫線,畫出來的圖案更多元。#include <stdio.h> #include <GL/glut.h> int N=0; int x[1000],y[1000]; void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_LINE_LOOP); for(int i=0;i<N;i++){ glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0); } glEnd(); glutSwapBuffers(); } void mouse(int button,int state,int mouseX,int mouseY) { if(state==GLUT_DOWN){ N++; x[N-1]=mouseX; y[N-1]=mouseY; 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("week05 mouse Motion"); glutDisplayFunc( display ); glutMouseFunc(mouse); glutMainLoop(); }
```
程式碼如下:
```C++
#include<stdio.h> #include <GL/glut.h> int N=0; int x[1000],y[1000]; void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBegin(GL_LINE_LOOP); for(int i=0;i<N;i++){ glVertex2f((x[i]-150)/150.0,-(y[i]-150)/150.0); } glEnd(); glutSwapBuffers(); } void motion(int mouseX,int mouseY) { N++; x[N-1]=mouseX; y[N-1]=mouseY; 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("week05 mouse Motion"); glutDisplayFunc( display ); glutMotionFunc(motion); glutMainLoop(); }
```
The End
沒有留言:
張貼留言