(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改成負號就可以做出左手了!!
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改成負號就可以做出左手了!!








沒有留言:
張貼留言