Week11
今天要教手臂轉動!
一開始一樣先做出茶壺
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutDisplayFunc(display);
glutMainLoop();
}
接下來要加第二個手臂!
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
這是第二個手臂的程式碼
整個加完後變->
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
angle++;///NOW
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
----------------------------------------------------------------------------------------------------------
再來是滑鼠控制
///angle++;///NOW ///NOW3
}
void motion(int x, int y)///NOW3 用活鼠mouse來控制angle
{
angle=x;///NOW3 用滑鼠mouse來控制angle
display();///NOW3 用滑鼠mouse來控制angle
}
這是滑鼠控制的程式碼
結果----->
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.3, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
///angle++;///NOW ///NOW3
}
void motion(int x, int y)///NOW3 用活鼠mouse來控制angle
{
angle=x;///NOW3 用滑鼠mouse來控制angle
display();///NOW3 用滑鼠mouse來控制angle
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMainLoop();
}
-----------------------------------------------------------------------------------------------------------------
接下來是鏡像
glPushMatrix();///左邊手臂
glTranslatef(-0.3, 0, 0);///(3) 掛在身體的左肩
glRotatef(-angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-.2, 0, 0);///(3) 掛在身體的左肘///NOW4
glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW4
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4
glColor3f(1,0,0);///紅色的///NOW4
glutSolidTeapot( 0.15 );///左下手臂///NOW4
glPopMatrix();///NOW4
glPopMatrix();
#include <GL/glut.h>
float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤
int jointID=1;///NOW6 配合鍵盤
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle1, 0,0,1);///(2) 旋轉 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW2 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊
glRotatef(-angle3, 0,0,1);///(2) 旋轉 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊
glPushMatrix();///NOW2 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊
glRotatef(-angle4, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左下手臂///NOW2 ///NOW4 複製左半邊
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
///angle++;///NOW ///NOW3
}
int oldX, oldY;///NOW5
void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle
{
if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
oldX=x;///NOW5
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
if(key=='1') jointID=1;///NOW6 配合鍵盤
if(key=='2') jointID=2;///NOW6 配合鍵盤
if(key=='3') jointID=3;///NOW6 配合鍵盤
if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
一開始一樣先做出茶壺
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glutSolidTeapot( 0.3 );
glutSwapBuffers();
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutDisplayFunc(display);
glutMainLoop();
}
------------------------------------------------------------------------------------------------------\
之後開始做手臂
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.3, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPopMatrix();
glutSwapBuffers();
angle++;///NOW
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
接下來要加第二個手臂!
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
這是第二個手臂的程式碼
整個加完後變->
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
angle++;///NOW
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
----------------------------------------------------------------------------------------------------------
再來是滑鼠控制
///angle++;///NOW ///NOW3
}
void motion(int x, int y)///NOW3 用活鼠mouse來控制angle
{
angle=x;///NOW3 用滑鼠mouse來控制angle
display();///NOW3 用滑鼠mouse來控制angle
}
這是滑鼠控制的程式碼
結果----->
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.3, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
///angle++;///NOW ///NOW3
}
void motion(int x, int y)///NOW3 用活鼠mouse來控制angle
{
angle=x;///NOW3 用滑鼠mouse來控制angle
display();///NOW3 用滑鼠mouse來控制angle
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMainLoop();
}
再來是加左邊的手臂
這是左邊手臂的程式碼
glPushMatrix();///左邊手臂
glTranslatef(-0.3, 0, 0);///(3) 掛在身體的左肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-.2, 0, 0);///(3) 掛在身體的左肘///NOW4
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW4
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4
glColor3f(1,0,0);///紅色的///NOW4
glutSolidTeapot( 0.15 );///左下手臂///NOW4
glPopMatrix();///NOW4
glPopMatrix();
-----------------------------------------------------------------------------------------------------------------
最後結果
#include <GL/glut.h>
float angle=0;///NOW
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.3, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW2
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂
glTranslatef(-0.3, 0, 0);///(3) 掛在身體的左肩
glRotatef(angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-.2, 0, 0);///(3) 掛在身體的左肘///NOW4
glRotatef(angle, 0,0,1);///(2) 旋轉///NOW4
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4
glColor3f(1,0,0);///紅色的///NOW4
glutSolidTeapot( 0.15 );///左下手臂///NOW4
glPopMatrix();///NOW4
glPopMatrix();
glutSwapBuffers();
///angle++;///NOW ///NOW3
}
void motion(int x, int y)///NOW3 用活鼠mouse來控制angle
{
angle=x;///NOW3 用滑鼠mouse來控制angle
display();///NOW3 用滑鼠mouse來控制angle
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMainLoop();
}
-----------------------------------------------------------------------------------------------------------------
接下來是鏡像
glPushMatrix();///左邊手臂
glTranslatef(-0.3, 0, 0);///(3) 掛在身體的左肩
glRotatef(-angle, 0,0,1);///(2) 旋轉
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW2
glTranslatef(-.2, 0, 0);///(3) 掛在身體的左肘///NOW4
glRotatef(-angle, 0,0,1);///(2) 旋轉///NOW4
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4
glColor3f(1,0,0);///紅色的///NOW4
glutSolidTeapot( 0.15 );///左下手臂///NOW4
glPopMatrix();///NOW4
glPopMatrix();
把左手臂的程式碼的"angle"前面加一個負號,就變鏡像了!
-----------------------------------------------------------------------------------------------------
再來要讓滑鼠更好控制,穩定滑鼠
int oldX,oldY;///NOW5
void motion(int x, int y)///NOW3 用活鼠mouse來控制angle
{
angle=x;///NOW3 用滑鼠mouse來控制angle
oldX=x;///NOW5;
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state,int x,int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX=x;///NOW5 要知道mouse的按鍵狀況,按下去時,就記得
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutMainLoop();
}
NOW5的部分是讓滑鼠穩定的程式碼
結果-->
---------------------------------------------------------------------------------------------------
今天的最後一個步驟!-->鍵盤控制
{
if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
oldX=x;///NOW5
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
if(key=='1') jointID=1;///NOW6 配合鍵盤
if(key=='2') jointID=2;///NOW6 配合鍵盤
if(key=='3') jointID=3;///NOW6 配合鍵盤
if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
-----------------------------------------------------------------------------------------------------
再來要讓滑鼠更好控制,穩定滑鼠
int oldX,oldY;///NOW5
void motion(int x, int y)///NOW3 用活鼠mouse來控制angle
{
angle=x;///NOW3 用滑鼠mouse來控制angle
oldX=x;///NOW5;
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state,int x,int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX=x;///NOW5 要知道mouse的按鍵狀況,按下去時,就記得
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutMainLoop();
}
NOW5的部分是讓滑鼠穩定的程式碼
結果-->
---------------------------------------------------------------------------------------------------
今天的最後一個步驟!-->鍵盤控制
{
if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
oldX=x;///NOW5
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
if(key=='1') jointID=1;///NOW6 配合鍵盤
if(key=='2') jointID=2;///NOW6 配合鍵盤
if(key=='3') jointID=3;///NOW6 配合鍵盤
if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤
int jointID=1;///NOW6 配合鍵盤
NOW6的部分是鍵盤控制的程式碼
結果-->
#include <GL/glut.h>
float angle1=0, angle2=0, angle3=0, angle4=0;///NOW ///NOW6 配合鍵盤
int jointID=1;///NOW6 配合鍵盤
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(255,255,255);///白色的
glutSolidTeapot( 0.3 );///身體
glPushMatrix();///右邊手臂
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肩
glRotatef(angle1, 0,0,1);///(2) 旋轉 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右手臂
glPushMatrix();///NOW2
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右肘///NOW2
glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW2 ///NOW6 配合鍵盤
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2
glColor3f(1,0,0);///紅色的///NOW2
glutSolidTeapot( 0.15 );///右下手臂///NOW2
glPopMatrix();///NOW2
glPopMatrix();
glPushMatrix();///左邊手臂 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肩 ///NOW4 複製左半邊
glRotatef(-angle3, 0,0,1);///(2) 旋轉 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左手臂 ///NOW4 複製左半邊
glPushMatrix();///NOW2 ///NOW4 複製左半邊
glTranslatef(-0.2, 0, 0);///(3) 掛在身體的左肘///NOW2 ///NOW4 複製左半邊
glRotatef(-angle4, 0,0,1);///(2) 旋轉///NOW2 ///NOW4 複製左半邊 ///NOW5 angle變負的
glTranslatef(-0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW2 ///NOW4 複製左半邊
glColor3f(1,0,0);///紅色的///NOW2 ///NOW4 複製左半邊
glutSolidTeapot( 0.15 );///左下手臂///NOW2 ///NOW4 複製左半邊
glPopMatrix();///NOW2
glPopMatrix();
glutSwapBuffers();
///angle++;///NOW ///NOW3
}
int oldX, oldY;///NOW5
void motion(int x, int y)///NOW3 用滑鼠mouse來控制angle
{
if(jointID==1) angle1 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==2) angle2 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==3) angle3 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
if(jointID==4) angle4 += (x-oldX);///NOW3 用滑鼠mouse來控制angle ///NOW6 配合鍵盤
oldX=x;///NOW5
display();///NOW3 用滑鼠mouse來控制angle
}
void mouse(int button, int state, int x, int y)///NOW5 要知道mouse的按鍵狀況
{///NOW5 要知道mouse的按鍵狀況
oldX = x; oldY = y;///NOW5 要知道mouse的按鍵狀況, 按下去時,就記得 oldX
}
void keyboard(unsigned char key, int x, int y)///NOW6 配合鍵盤
{
if(key=='1') jointID=1;///NOW6 配合鍵盤
if(key=='2') jointID=2;///NOW6 配合鍵盤
if(key=='3') jointID=3;///NOW6 配合鍵盤
if(key=='4') jointID=4;///NOW6 配合鍵盤
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH );
glutCreateWindow("week11 TRT");
glutIdleFunc(display);///NOW
glutDisplayFunc(display);
glutMotionFunc(motion);///NOW3 用滑鼠mouse來控制angle
glutMouseFunc(mouse);///NOW5 要知道mouse的按鍵狀況
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
今天東西真多~END
沒有留言:
張貼留言