2021年3月29日 星期一

Hello World_Week06

20210329 關節移動&轉動


一開始先複習一下圖案的旋轉移動跟畫圖

可參照底下的網址

https://2021graphics.blogspot.com/2021/03/hello-worldweek05.html

再來要讓自己做出來的圖案自行旋轉

先從用鍵盤原地旋轉開始

(只要按住空白鍵 圖案就會逆時針旋轉)




#include <GL/glut.h>///使用GLUT外掛
#include <stdio.h>
int N=0,vx[3000],vy[3000];///用陣列存頂點
float angle=0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清空
    glPushMatrix();///備份矩陣
        glRotatef(angle,0,0,1);
        glScalef(0.5,0.1,0.1);
        glColor3f(0.3,0.3,1.0);
        glutSolidCube(1);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();///交換2倍的buffers
}

void mouse(int button,int state,int x,int y)///控制滑鼠
{

}

void keyboard(unsigned char key,int x,int y)
{
    angle++;
    display();
}

void motion(int x,int y)///移動
{
    printf("%d %d\n",x,y);///把頂點記下來
    vx[N]=(x-150)/150.0;///換算座標
    vy[N]=-(y-150)/150.0;
    N++;
    display();///即時更新
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);///GULT初始設定
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);///顯示模式
    glutCreateWindow("Move");///開視窗

    glutDisplayFunc(display);///要顯示的函式
    glutMouseFunc(mouse);///使用滑鼠函式
    glutKeyboardFunc(keyboard);///移動的函式
    glutMotionFunc(motion);///移動的函式
    glutMainLoop();///主要的迴圈
}

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

再來是用滑鼠讓圖案原地旋轉

(只要按住滑鼠左鍵 圖案就會逆時針旋轉)





然後來簡化一下程式碼 只留下自行旋轉的部分

一樣先用一個長方形做旋轉(前臂)



#include <GL/glut.h>///使用GLUT外掛
float angle=0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清空
    glPushMatrix();///備份矩陣
        glRotatef(angle++,0,0,1);///自行增加角度
        
        glScalef(0.5,0.1,0.1);
        glutSolidCube(1);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();///交換2倍的buffers
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);///GULT初始設定
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);///顯示模式
    glutCreateWindow("Turn");///開視窗

    glutIdleFunc(display);///重整畫面
    glutDisplayFunc(display);///要顯示的函式
    glutMainLoop();///主要的迴圈
}

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

再來要移動旋轉的中心點(從圖案的中間移到圖案的右邊)

如果不移動旋轉的中心點的話 圖案就只會原地轉 沒辦法繞圈圈



#include <GL/glut.h>///使用GLUT外掛
float angle=0;

void display()
{
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);///清空
    glPushMatrix();///備份矩陣
        glRotatef(angle++,0,0,1);///自行增加角度
        glTranslatef(-0.25,0,0);///移動中心點
        
        glScalef(0.5,0.1,0.1);
        glutSolidCube(1);
    glPopMatrix();///還原矩陣
    glutSwapBuffers();///交換2倍的buffers
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);///GULT初始設定
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);///顯示模式
    glutCreateWindow("Turn");///開視窗

    glutIdleFunc(display);///重整畫面
    glutDisplayFunc(display);///要顯示的函式
    glutMainLoop();///主要的迴圈
}

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

然後要用長方形來模擬手臂關節轉動的樣子

所以要再放一個固定的長方形(上臂)

並將旋轉的長方形(前臂)移到固定的長方形(上臂)的左邊

這樣看起來才會是關節轉動的感覺



#include <GL/glut.h>///使用GLUT外掛
float angle=0;

void hand()///畫長方形
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);
        glutSolidCube(1);
    glPopMatrix();
}

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);///移動中心點
        hand();///會動的長方形
    glPopMatrix();///還原矩陣
    hand();///不會動的長方形
    glutSwapBuffers();///交換2倍的buffers
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);///GULT初始設定
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);///顯示模式
    glutCreateWindow("Turn");///開視窗

    glutIdleFunc(display);///重整畫面
    glutDisplayFunc(display);///要顯示的函式
    glutMainLoop();///主要的迴圈
}

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

接下來要讓固定的長方形(上臂)也一起轉動

這樣就可以做出揮手的感覺了




#include <GL/glut.h>///使用GLUT外掛
float angle=0;

void hand()///畫長方形
{
    glPushMatrix();
        glScalef(0.5,0.1,0.1);
        glutSolidCube(1);
    glPopMatrix();
}

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);///移動中心點
        hand();///會動的長方形
        
        glPushMatrix();///備份矩陣
            glTranslatef(-0.25,0,0);///移動物體
            glRotatef(angle,0,0,1);
            glTranslatef(-0.25,0,0);///移動中心點
            hand();///會動的長方形
        glPopMatrix();///還原矩陣
        
    glPopMatrix();///還原矩陣
    glutSwapBuffers();///交換2倍的buffers
    angle++;///增加角度
}

int main(int argc,char** argv)
{
    glutInit(&argc,argv);///GULT初始設定
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH);///顯示模式
    glutCreateWindow("Turn");///開視窗

    glutIdleFunc(display);///重整畫面
    glutDisplayFunc(display);///要顯示的函式
    glutMainLoop();///主要的迴圈
}

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

最後因為手有2隻 所以要做2組





最後 回家作業做了更多的關節轉動






沒有留言:

張貼留言

Week18期末作業(橘貓的跳舞熊熊)

 期末作業(橘貓的跳舞熊熊) 影片: https://youtu.be/R89tptMaQZw 程式碼: #include <opencv/highgui.h> #include <opencv/cv.h> #include <GL/glut.h...