2022/5/17 第十三周
主題 : TRT 的 R的角度、搭配鍵盤滑鼠、
1. 畫出一個長方形---- Rectf();
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glRectf( 0.3, 0.5, -0.3, -0.5);
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week13 rect TRT");
glutDisplayFunc(display);
glutMainLoop();
}
2. 加上一個手(小方塊) #include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
///glTranslatef(x,y,z); ///(3)把手臂掛回身體
///glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
///glTranslatef(x2,y2,z2); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///手臂
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT");
glutDisplayFunc(display);
glutMainLoop();
}
3. 用上面的程式 講解TRT
(1) 把手的旋轉中心,放到中心
----手的原本座標在(0.3,0.5),想把手調到中心
#include <GL/glut.h>
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
///glTranslatef(x,y,z); ///(3)把手臂掛回身體
///glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4, 0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///手臂
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT");
glutDisplayFunc(display);
glutMainLoop();
}
(2) 旋轉 (對z軸做旋轉)
#include <GL/glut.h>
float angle=45;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
///glTranslatef(x,y,z); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef(-0.3,-0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///手臂
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT");
glutDisplayFunc(display);
glutMainLoop();
}
(3)把手臂掛回身體(把手臂放回去原來的地方)
#include <GL/glut.h>
float angle=45;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///手臂
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT");
glutDisplayFunc(display);
glutMainLoop();
}
4. 按住滑鼠左右拉 讓手臂可以轉動
#include <GL/glut.h>
float angle=45, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///手臂
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}
5. 多畫一個手臂關節
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂
glPushMatrix();
///glTranslatef(x,y,z);
///glRotatef(angle,0,0,1);
///glTranslatef(x2,y2,z2);
glColor3f(0,1,0);///綠色
glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}
(1) 把綠手臂的旋轉中心,放到中心
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂
glPushMatrix();
///glTranslatef(x,y,z);
///glRotatef(angle,0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);///紅色
glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}
(2) 綠手臂對z軸做旋轉(暫時把紅手臂的Rotate註解)
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
///glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂
glPushMatrix();
///glTranslatef(x,y,z);
glRotatef(angle,0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);///紅色
glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}

(3) 把綠手臂掛回身體
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
///glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂
glPushMatrix();
glTranslatef(0.7,0.4,0);
glRotatef(angle,0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);///紅色
glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}

(4)把紅手臂的rotate加回去(跟綠手臂一起旋轉)
///week13_rect_TRT_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///紅手臂
glPushMatrix();
glTranslatef(0.7,0.4,0);
glRotatef(angle,0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);///紅色
glRectf( 0.7, 0.5, 1.0, 0.3);///綠手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}

6.加上左手臂( x 的值要相反--->正轉負,負轉正(因為鏡射))
///week13_rect_many_TRT
#include <GL/glut.h>
float angle=0, oldX=0;
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();///右半部
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///右上手臂
glPushMatrix();
glTranslatef(0.7,0.4,0);
glRotatef(angle,0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);///綠色
glRectf( 0.7, 0.5, 1.0, 0.3);///右上手臂
glPopMatrix();
glPopMatrix();
glPushMatrix();///左半部
glTranslatef(-0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle,0,0,1); ///(2)對z軸做旋轉
glTranslatef(+0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf(-0.3, 0.5,-0.7, 0.3);///左上手臂
glPushMatrix();
glTranslatef(-0.7,0.4,0);
glRotatef(angle,0,0,1);
glTranslatef(+0.7,-0.4,0);
glColor3f(0,1,0);///綠色
glRectf(-0.7, 0.5,-1.0, 0.3);///左下手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}

7. 需要很多angle(ex:四個關節)
--->keyboard(按鍵盤上的數字,可以選擇要控制幾號關節)
--->angleID(如果angleID=0,angle=0 [0號關節的意思])
///week13_rect_many_TRT
#include <GL/glut.h>
float angle[20], oldX=0;
int angleID=0; ///0號關節,1號關節...
void keyboard(unsigned char key, int x, int y) ///鍵盤按數字,讀到angleID
{
if(key=='0') angleID=0;
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
}
void mouse(int button, int state, int x, int y)///滑鼠按下去
{
oldX = x;
}
void motion(int x, int y)///滑鼠拖曳
{
angle[angleID] += (x-oldX);
oldX = x;
glutPostRedisplay(); ///請GLUT重畫畫面
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(1,1,1);///白色
glRectf( 0.3, 0.5, -0.3, -0.5);///身體
glPushMatrix();///右半部
glTranslatef( 0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle[0],0,0,1); ///(2)對z軸做旋轉
glTranslatef( -0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf( 0.3, 0.5, 0.7, 0.3);///右上手臂
glPushMatrix();
glTranslatef(0.7,0.4,0);
glRotatef(angle[1],0,0,1);
glTranslatef(-0.7,-0.4,0);
glColor3f(0,1,0);///綠色
glRectf( 0.7, 0.5, 1.0, 0.3);///右上手臂
glPopMatrix();
glPopMatrix();
glPushMatrix();///左半部
glTranslatef(-0.3, 0.4, 0); ///(3)把手臂掛回身體
glRotatef(angle[2],0,0,1); ///(2)對z軸做旋轉
glTranslatef(+0.3, -0.4,0); ///(1)把手的旋轉中心,放到中心
glColor3f(1,0,0);///紅色
glRectf(-0.3, 0.5,-0.7, 0.3);///左上手臂
glPushMatrix();
glTranslatef(-0.7,0.4,0);
glRotatef(angle[3],0,0,1);
glTranslatef(+0.7,-0.4,0);
glColor3f(0,1,0);///綠色
glRectf(-0.7, 0.5,-1.0, 0.3);///左下手臂
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode( GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);
glutCreateWindow("week13 rect TRT TRT");
glutKeyboardFunc(keyboard);
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(display);
glutMainLoop();
}

8.上週作業修改(看老師的教學影片) void readALLModel(){
}
GLMmodel * readOneModel(char * filename){
}
void display(){
glmDraw(body,GLM_MATERIAL);
glPush
T
R
T
glmDraw(head1,GLM_MATERIAL);
glPush
T
R
T
glmDraw(head2,GLM_MATERIAL);
glPop
glPop
}
沒有留言:
張貼留言