2023年3月22日 星期三

Deverra//week06 階層轉動

 

WEEK06---階層轉動
---------------------------------------------------------------------------------------------------------------------------
*今日小考: TRT
筆記/ (反著寫上去)
1) 把物件移到中心點( x,y,z)
2) 讓物件旋轉( 度,0,0,1)
3) 把物件移到想要的點上(x,y,z)

---------------------------------------------------------------------------------------------------------------------------

▧為了再次熟悉TRT轉動,老師帶我們寫了下面的茶壺

#include <GL/glut.h>
float angle=0; 
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
glutSolidSphere(0.02,30,30);
    glPushMatrix();
        glRotatef(angle,0,0,1);
        glTranslatef(0.46,-0.05,0); //把茶壺把手移動到中心點
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
    angle++;  
}
int main(int argc, char *argv[])
{
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutCreateWindow("GLUT Shapes");
  glutDisplayFunc(display);
  glutIdleFunc(display);
  glutMainLoop();
}
建立在中心點的茶壺
把手把移到中心點
加上轉動的程式就會在中心點旋轉了


---------------------------------------------------------------------------------------------------------------------------
▧修改上面的程式碼嘗試讓兩個茶壺掛在一起

#include <GL/glut.h>
float angle=0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidSphere(0.02,30,30);
   
glutSolidTeapot(0.3); //身體
    glPushMatrix();
        glTranslatef(0.49,0.13,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.46,-0.05,0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}

利用translate函式把茶壺利用TRT掛到壺嘴上

---------------------------------------------------------------------------------------------------------------------------

#include <GL/glut.h>
float angle=0;
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glutSolidSphere(0.02,30,30);
   
glutSolidTeapot(0.3); //身體

    glPushMatrix();//右手臂
        glTranslatef(0.49,0.13,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.46,-0.05,0);
        glutSolidTeapot(0.3);

       | glPushMatrix();
       |     glTranslatef(0.49,0.13,0);
       |     glRotatef(angle,0,0,1);
       |     glTranslatef(0.46,-0.05,0);
       |     glutSolidTeapot(0.3);
       | glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}
Push與Pop像程式大括號一樣把TRT的程式碼一層一層包含在內

---------------------------------------------------------------------------------------------------------------------------

▨茶壺畫面太亂了,試著用方塊做做看階層式轉動

#include <GL/glut.h>
float angle=0;
void drawHand()
{
    glPushMatrix();
        glScalef(1,0.3,0.3);  //縮放
        glutSolidCube(0.5);
    glPopMatrix();
}
void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        drawHand();
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}
...

▨多建一個手臂

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glPushMatrix();
        //glRotatef(angle,0,0,1);
        //glTranslatef(0.25,0,0);
        drawHand();
        glPushMatrix();
            glRotatef(angle,0,0,1);
            glTranslatef(0.25,0,0);
            drawHand();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}
另外建立一個小手臂,但是位置不對,所以還需要重新掛上去

▨掛到對的位置上

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
glPushMatrix();
        glTranslatef(0.25,0,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        drawHand();
        glPushMatrix();
            glTranslatef(0.25,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(0.25,0,0);
            drawHand();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}
注意先定好一個的位置再做掛的動作

---------------------------------------------------------------------------------------------------------------------------

▨把左手也做出來(直接複製右手,更改正負號)

void display()
{
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
   
glPushMatrix();//右手
        glTranslatef(
0.25,0,0);
        glRotatef(angle,0,0,1);
        glTranslatef(0.25,0,0);
        drawHand();
       
glPushMatrix();
            glTranslatef(0.25,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(0.25,0,0);
            drawHand();
        glPopMatrix();
    glPopMatrix();

    glPushMatrix();//左手
        glTranslatef(
-0.25,0,0);
        glRotatef(angle,0,0,1);
        glTranslatef(
-0.25,0,0);
        drawHand();
       
glPushMatrix();
            glTranslatef(-0.25,0,0);
            glRotatef(angle,0,0,1);
            glTranslatef(-0.25,0,0);
            drawHand();
        glPopMatrix();
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}











沒有留言:

張貼留言