2017年10月5日 星期四

圖學筆記Week04

第一步 拿出標準範例

->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();

}


->


沒有留言:

張貼留言