2020年3月25日 星期三

章魚花枝幫_Week04


在下方網址照著之前的步驟下載下來
http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/

今天先複習之前所做的事情,這次則是要開啟Transformation.exe這個檔案
把3D模型換成黑幫老大 : 右上視窗>右鍵>All Capone

玩玩下面的數值看他的變化,你會發現第1個是移動,第2個是旋轉,第3個是放大縮小

今天的重點是轉向,你會覺得很奇怪為什麼有四個數值,明明只有X、Y、Z這三個軸,
使用它時有幾個數值沒什麼變化,但是突然變成負數的時候會變成反面,因為它就是用來挑整軸方向的數值,原本的Y軸是往上,使用它的時候就可以變成向下。
數值如 :  ( 轉的角度 , X軸使用比例 , Y軸使用比例 , Z軸使用比例 )
下面給幾個實例:


接下來是實作練習----------------------------------------------------------------


我們這次開完專案後,保留開始的程式碼,先理解程式碼的構造。
display函式是我們顯示圖樣的作業,所以先從他下手

我們會看到上面我們學的程式碼上都有用的 ""a"" 變數作旋轉。

這次用motion程式並設置function,還記得我們用函式都要在main()引用





我們用一個變數等下套用在變數"a"

再去描述motion,angle等於我們滑鼠的X向量,再下面再刷新程式


angle套用在變數"a"


就會發現那三個物體會照著你滑鼠轉動了!!



我們重新作一次如下:照茶壺做法>添加剛剛學的程式碼在下方

補充 : 
因為程式沒有刷新圖案,移動中的圖案都會留下,所以要清除需要藍色的程式把他們清除

這樣茶壺是不是就也會轉動了呢?

但是你會發現右BUG,轉動是不是一直不順?轉到一半想要繼續,卻感覺回到一開始的位置沒辦法接續,這是因為motion只記得轉動量,要記錄下轉動的紀錄需要使用mouse函式。

我們作一個mouse不斷記錄下x的位置再減去之前的位置,主要是要算出它移動量在進行疊加,這樣angle就不會再歸零了!!

最後程式碼提供在下方:
========================================================================

#include <GL/glut.h>


float angle=0,oldX=0;

void motion(int x,int y)
{
    angle+=(x-oldX);///angle=x;
    oldX=x;
    glutPostRedisplay();

}
void mouse(int button, int state, int x, int y)
{
    oldX=x;
}

static void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glPushMatrix();
        glRotatef (angle,0,0,1);
        glutSolidTeapot(0.3);
    glPopMatrix();

    glutSwapBuffers();
}



int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week04");


    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMouseFunc(mouse);
    glutMainLoop();

}



沒有留言:

張貼留言