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();///主要的迴圈
}
--------------------------------------------------------------------------------------------------------------------------















沒有留言:
張貼留言