2018年3月30日 星期五

week05 李宜謙


(1)比較先位移或先旋轉兩者差異 

位移(translate)與旋轉(rotate)先後會導致結果的差別

技巧如下,越靠近BeginEnd的越優先,先縮放、再位移縮放後的物件、最後旋轉位移的物件


先位移再旋轉,會以原位置為中心旋轉(公轉)


相反的如下圖,縮放、再旋轉縮放後的物件、最後位移旋轉的物件


先旋轉再位移,會以自身為中心旋轉(自轉)

(2)T-R-T實作

原始程式使用基本的轉動,但轉動一直在原地在(0,0)轉動,不是用茶壺手把轉動欸!?


所以我們進行修改,利用x與y軸平面座標(如圖所示),將手把固定在正中間

這樣就能進行倒茶了!!

經過上面簡單的例子,我們進階應用到關節相關的程式

首先我們分別將原本點茶壺改為紅色,並在新建一個綠色茶壺

用TRT將綠色茶壺的手把掛在紅色的上面就行轉動

接著我們可以試著做出茶壺手臂

有注意到嗎?手臂跟手肘都有用到TRT轉動

CODE

#include <GL/glut.h>
float angle=0;///Now: 讓茶壼自動轉動的角度
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();///Now:備份矩陣
            glColor3f(1,0,0);     glutSolidTeapot(0.3); //中間的紅色茶壺
            glPushMatrix();///右手臂
                    glTranslatef(0.4,0.13,0); ///最後掛上去
                    glRotatef(angle, 0,0,1);///Now:轉動樓下全部
                    glTranslatef(0.45,-0.1,0);///把茶壺柄移到中間
                    glColor3f(0,1,0);         glutSolidTeapot(0.3);
                    glPushMatrix();///右手肘
                            glTranslatef(0.4,0.13,0); ///最後掛上去
                            glRotatef(angle, 0,0,1);///Now:轉動樓下全部
                            glTranslatef(0.45,-0.1,0);///把茶壺柄移到中間
                            glColor3f(0,1,0);         glutSolidTeapot(0.3);
                    glPopMatrix();
            glPopMatrix();

    glPopMatrix();///Now:還原矩陣
    glutSwapBuffers();
}
void motion(int x, int y)
{
    angle=x;///Now: 改變角度
    glutPostRedisplay();///Now: 請 重畫畫面
}
int main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);
    glutCreateWindow("Week05 TRT");
    glutDisplayFunc(display);
    glutMotionFunc(motion);
    glutMainLoop();
}

X軸 Translate改成負號就可以做出左手了!!



沒有留言:

張貼留言