2023年3月16日 星期四

week05 蔣

WEEK05

week05-0

開啟https://jsyeh.org/3dcg10網頁,下載data和windows,解壓縮後把data丟進windows裡,開啟Transformation,複習上週的移動-旋轉,旋轉-移動

week05-1 TRT_translate_rotate

拿上週week04-1的程式碼來用
將旋轉軸改成z軸,再複製成 紅色 綠色


#include <GL/glut.h>
float angle = 0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glColor3f(1,0,0);///紅色
    glPushMatrix();
        glRotatef(angle,0,0,1);///改成0,0,1 z軸
        glTranslatef(0.8,0,0);///移到右邊
        glutSolidTeapot( 0.3 );
    glPopMatrix();

    glColor3f(0,1,0);///綠色
    glPushMatrix();
        glTranslatef(0.8,0,0);
        glRotatef(angle*1.5,0,0,1);
        glutSolidTeapot( 0.3 );
    glPopMatrix();

    glutSwapBuffers( );
    angle++;
}
int main(int argc, char *argv[ ])

{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week05");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop( );
}

week05-2 TRT_robot

打開老師給的opengl_TRT_demo的互動程式 跑起來 按ToDraw可以畫身體,話頭,畫手


myDrawObject(0); ///畫身體
glPushMatrix();
    glTranslatef(0.05,0.31,0);  ///(3) 最後,把手掛到肩上
    glRotatef(angle,0,0,1);   ///(2)轉動
    glTranslatef(0.05,-0.31,0);  ///(1)把關節放正中心
    myDrawObject(1); ///畫手臂
glPopMatrix();
    


接下來講解下周考試題目,以奇異博士手上拿著寶石為例,drawHand()可以畫手,但它的旋轉中心沒有放在正中心,所以(1)先把關節移到正中心 (2)上面再加上轉動,小心轉動軸不要寫錯,角度的正負號也不能寫錯 (3)最後,最上面,就簡單的把會轉動的手掛到手軸上



複製week05-1的程式碼,中間程式碼刪掉改成如下,用 glutSolidCube(1)可畫出寬度1的方塊, 發明myCube()函式,可以用glScalef(0.5, 0.2, 0.2) 把方塊調成細長狀, 再把矩陣保護起來。再來用小考的T-R-T觀念, 慢慢把方塊變成正確轉動的手臂 (1) 調中心, (2)轉動, (3)掛到對的位置。




#include <GL/glut.h>
float angle = 0;
void myCube()///改函式
{
    glPushMatrix();
            glScalef(0.5,0.2,0.2);///調大小
            glutSolidCube(1);///正方塊
    glPopMatrix();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

    glColor3f(1,1,1);///白色的
    glutSolidCube(1);///身體

    glPushMatrix();
        glTranslatef(0.5,0.5,0);///掛到右上角去
        glRotatef(angle,0,0,1);///轉它
        glTranslatef(0.25,0,0);///往右移動0.25讓關節再正中心
        glColor3f(0,1,0);///綠色的
        myCube();///改函式
    glPopMatrix();

    glPushMatrix();
        glTranslatef(-0.5,0.5,0);///掛到左上角去
        glRotatef(angle,0,0,1);///轉它
        glTranslatef(0.25,0,0);///往右移動0.25讓關節再正中心
        glColor3f(0,1,0);///綠色的
        myCube();///改函式
    glPopMatrix();

    glutSwapBuffers( );
    angle++;
}
int main(int argc, char *argv[ ])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutCreateWindow("Week05");
    glutDisplayFunc(display);
    glutIdleFunc(display);
    glutMainLoop( );
}






沒有留言:

張貼留言