2023年3月23日 星期四

Week06 Zhouuu

 Week06

開啟CodeBlocks 並開啟GLUT專案 並下載把freeglut解壓縮

且把libfreeglut.a 複製改成libglut32.a
複製上週的week05-2的程式碼
拿來修改為以下程式碼
就會出現一個旋轉茶壺
#include <GL/glut.h>
float angle = 0;
void display()
{
    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);
    glutSolidSphere(0.01,30,30);
    glPushMatrix();
        glRotatef(angle,0 ,0 ,1);
        glTranslatef(0.45, 0, 0);
        glutSolidTeapot(0.3);
    glPopMatrix();
    glutSwapBuffers();
    angle++;
}

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





這樣就成功把中心點弄好了
接下來多加以下這行程式碼
glTranslatef(0.5, 0.5, 0);
就拿把茶壺掛在其他地方旋轉




建立一個新的GLUT專案
利用剛剛的程式碼來修改為
下面程式碼
#include <GL/glut.h>
float angle = 0;
void myCube()
{
    glPushMatrix();
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();
}
void display()
{

    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    glutSolidSphere(0.01,30,30);

    glPushMatrix();
        ///glTranslatef(0.5, 0.5, 0);
        ///glRotatef(angle,0 ,0 ,1);
        ///glTranslatef(0.45, 0, 0);
        myCube();
    glPopMatrix();

    glutSwapBuffers();
    angle++;
}


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


執行後就會出現以下畫面
一個不會動的長方形






接著修改程式碼為下列圖片
就會讓剛才出現的長方形開始轉動
而綠色框框代表的是旋轉的中心點




再新增以下紅框裡的程式碼
就會出現一個往右移且會旋轉的長方形




接著在原本
 glPushMatrix();
            glTranslatef(0.25, 0, 0);
            glRotatef(angle,0 ,0 ,1);
            glTranslatef(0.25, 0, 0);
            myCube();
  glPopMatrix();
這個函式裡在包含一個一模一樣的函式
就會變成以下程式碼
glPushMatrix();
        glTranslatef(0.25, 0, 0);
        glRotatef(angle,0 ,0 ,1);
        glTranslatef(0.25, 0, 0);
        myCube();
        glPushMatrix();
            glTranslatef(0.25, 0, 0);
            glRotatef(angle,0 ,0 ,1);
            glTranslatef(0.25, 0, 0);
            myCube();
        glPopMatrix();
    glPopMatrix();

執行後就會出現以下畫面
兩個旋轉的長方形連在一起



接著將程式碼修改為以下
#include <GL/glut.h>
float angle = 0;
void myCube()
{
    glPushMatrix();
        glScalef(1,0.3,0.3);
        glutSolidCube(0.5);
    glPopMatrix();
}
void display()
{

    glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT);

    glutSolidSphere(0.01,30,30);

    glPushMatrix();           /// 邊的
        glTranslatef(0.25, 0, 0);
        glRotatef(angle,0 ,0 ,1);
        glTranslatef(0.25, 0, 0);
        myCube();               /// 上手臂
        glPushMatrix();
            glTranslatef(0.25, 0, 0);
            glRotatef(angle,0 ,0 ,1);
            glTranslatef(0.25, 0, 0);
            myCube();            ///下手肘
        glPopMatrix();
    glPopMatrix();


    glPushMatrix();            ///左邊的
        glTranslatef(-0.25, 0, 0);
        glRotatef(angle,0 ,0 ,1);
        glTranslatef(-0.25, 0, 0);
        myCube();                ///上手臂
        glPushMatrix();
            glTranslatef(-0.25, 0, 0);
            glRotatef(angle,0 ,0 ,1);
            glTranslatef(-0.25, 0, 0);
            myCube();            ///下手肘
        glPopMatrix();
    glPopMatrix();



    glutSwapBuffers();
    angle++;
}


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

執行後就會出現以下畫面~






接著我們要修改程式碼來讓滑鼠
可以旋轉這兩隻手臂
新增一個新的motion的函式
新增且修改為以下紅框內的程式碼
執行後就可以用滑鼠來轉兩個手臂



修改剛剛的程式碼
接著利用新的mouse函式來更精準轉動
程式碼修改為以下圖片黃框所示

執行程式碼就能精準控制手臂囉

















沒有留言:

張貼留言