第一步 拿出標準範例
->code block開啟glut專案檔(第一週上課部份請回顧Week01)->

第二步 理解範例程式中Translate程式碼:
translate(x,y,z); x為螢幕左右位移(X座標) Y為上下(Y座標) Z前後(Z座標,有遠近的感覺)->
這是原本範例->
茶壺便是嘗試使用額外畫的圖glPushMatrix();
glColor3d(1,1,0);
glTranslated(1.3,0,-6);
glRotated(60,1,0,0);
glRotated(a,0,0,1);
glutSolidTeapot(1);
glPopMatrix();
第三步 glRotated函式
glRotated(60,1,0,0); 60是指角度, 1,0,0分別指X Y Z座標 (1,0,0)就是代表了X軸->此行意思為:以座標軸(1,0,0)旋轉60度 (右手座標原則,逆時針繞)
->

茶壺:含有 glRotated(a,0,0,1); (會不斷旋轉)
左下錐形圖:沒有任何glRotated函式;
中間下方的錐形圖: glRotated(30,1,0,0); (所以看起來與左下的圖有角度的不同)
----------------------------------
-> const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;
glRotated(a,0,0,1);
a變數取決於t而t是時間函數所以,a會隨時間一直改變,也因此圖形能不斷旋轉
第四步 大小縮放 glScaled(x,y,z);
->分別對x y z分量做比例放大。
->所以是可以單獨放大縮小的。
->

->紅圈為原本大小
黃圈為1.5倍大 ------------------------------------------------glScaled(1.5,1.5,1.5);
下方紫色網圈為X分量1.5倍 Y、Z為0.5倍----------------glScaled(1.5,0.5,0.5);
第五步 拖曳圖形
#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
float dx=0,dy=0,dz=0;
int oldX=0,oldY=0,oldZ=0;
void display()
{
glClearColor(0.5,0,1,0); //背景顏色
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslated(dx,dy,dz);
glutSolidTeapot(0.3);//此行是自己+的程式碼 作用為畫出茶壺的圖案。
glPopMatrix();
glutSwapBuffers();
}
void Motion(int x,int y)
{
dx+=(x-oldX)/150.0;
dy+=-(y-oldY)/150.0;
oldX=x,oldY=y;
glutPostRedisplay();
}
void Mouse(int button,int state,int x,int y)
{
if(state==GLUT_DOWN){oldX=x;oldY=y;}
}
int main(int argc,char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutMouseFunc(Mouse);
glutMotionFunc(Motion);
glutDisplayFunc(display);
glutMainLoop();
}
->

沒有留言:
張貼留言