2019電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2019年6月29日 星期六
2019年5月31日 星期五
ㄟOWOㄏ - Week15
{\__/}
( • - •)
< \\先來動手調調看鏡頭/
有三種不同的鏡頭喔//
STEP 1 → 開啟GLUT專案
STEP 2 → 去>>>http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/<<<下載source
STEP 3 → 將以下三個檔案拉進專案的資料夾裡面(glm.c檔記得改成glm.cpp檔)
STEP 4 → 將glm.cpp檔以add file的方式加入專案
STEP 5 → 將main.cpp的程式碼都刪掉,輸入新的
STEP 6 → 記得將模型的檔案拉入bin資料夾裡
STEP 5 → 將main.cpp的程式碼都刪掉,輸入新的
STEP 6 → 記得將模型的檔案拉入bin資料夾裡
\來看看程式碼/
#include <GL/glut.h>
#include "glm.h" ///for glmReadOBJ(), glmDraw(), glmUnitized()....
GLMmodel * pmodel=NULL;///NOW
void drawmodel(void)
{
if (!pmodel) {
pmodel = glmReadOBJ("data/al.obj");
if (!pmodel) exit(0);
glmUnitize(pmodel);
glmFacetNormals(pmodel);
glmVertexNormals(pmodel, 90.0);
}
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawmodel();
glutSwapBuffers();
}
#include <math.h>
float eyeX=1, eyeY=0, eyeZ=0;
void timer(int t)///NOW3
{
glutTimerFunc(33, timer, t+1);///NOW3
float angle=t/180.0*3.1415926;///NOW3 算出一個角度
eyeX=cos(angle); eyeZ=sin(angle);///NOW3
glMatrixMode(GL_PROJECTION);///NOW4
glLoadIdentity();///NOW4
gluPerspective(60, 1, 0.001, 1000);///NOW5
///glOrtho(-1,+1, -1,+1, -10,+10);///NOW4 可以看到範圍比較大的投影法
glMatrixMode(GL_MODELVIEW);///NOW3
glLoadIdentity();///NOW3
gluLookAt(eyeX, eyeY, eyeZ, ///NOW3 LookAt的 eye
0.0, 0.6, 0.0, ///NOW3 LookAt的 center
0, 1, 0);///NOW3 LookAt的 up
glutPostRedisplay();///NOW3 Re-display
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);
glutCreateWindow("week15");
glutDisplayFunc(display);
glutTimerFunc(33, timer, 0);///NOW3
GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };///NOW2 打光的位置
glEnable(GL_DEPTH_TEST);///NOW2 有立體的功能
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
glutMainLoop();
}
2019年5月24日 星期五
ㄟOWOㄏ - Week14
{\__/}
( • - •)
< \\今天要來做計時器/

開啟GLUT專案
以下為計時器的程式碼//
#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
#include <stdio.h>///NOW3 for printf()
float angle=0;///NOW4
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///NOW4
glRotatef(angle, 0, 0, 1);///NOW4
glutSolidTeapot( 0.3 );///NOW4
glPopMatrix();///NOW4
glutSwapBuffers();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(30, timer, t+1);///NOW4 ///NOW3 一起床,馬上撥下一個鬧鐘, 時間才會準
printf("現在的 timer(t)的t是: %d\n", t);///NOW3
angle = t;///NOW4
glutPostRedisplay();///NOW4 要更新畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
glutMainLoop();
}
\再把內插公式寫入CodeBlocks裡/

\再來看看內插公式/
\再把內插公式寫入CodeBlocks裡/

#include <GL/glut.h>
#include <mmsystem.h>///NOW (0)發聲音
#include <stdio.h>///NOW3 for printf()
float angle=0;///NOW4
float nowX=0;///內插公式
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///NOW4
//glRotatef(angle, 0, 0, 1);///NOW4
glTranslatef(nowX,0,0);///NOW5
glutSolidTeapot( 0.3 );///NOW4
glPopMatrix();///NOW4
glutSwapBuffers();
}
void timer(int t)///NOW (2)
{
glutTimerFunc(33, timer, t+1);///NOW4 ///NOW3 一起床,馬上撥下一個鬧鐘, 時間才會準
printf("現在的 timer(t)的t是: %d\n", t);///NOW3
float alpha = (t%30)/30.0;///內插公式
nowX=alpha*1.0+(1-alpha)* -1.0;///內插公式
glutPostRedisplay();///NOW4 要更新畫面
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500,500);///大一點
glutCreateWindow("week14 timer");
glutDisplayFunc(display);
glutTimerFunc(1000, timer, 0);///NOW (1)
glutMainLoop();
}
2019年5月17日 星期五
ㄟOWOㄏ - Week13
{\__/}
( • - •)
< \\先來看看開啟檔案並在檔案中印出的程式碼/
用貝殼專案開啟
#include <stdio.h>
FILE * fout=NULL;
int main()
{
fout = fopen("filename.txt","w+");
for(int i=0;i<20;i++){
fprintf(fout,"Hello world!\n");
}
}
///NOW5為讀取之前轉動的動作,一直按r就可以看到之前所做的動作
#include <stdio.h> ///(0) ///NOW4
#include <GL/glut.h>
FILE * fout=NULL;///(1) ///NOW4
FILE * fin =NULL;///(1) ///NOW5
float angle[20];///NOW
int angleID=1;///第幾個要轉動的關節 ///NOW3
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[2], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right lower arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[3], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(-0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[4], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left lower arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[angleID] += (x-oldX);///NOW ///NOW3
oldX = x;///NOW
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
display();///NOW
}
void keyboard(unsigned char key, int x, int y)///NOW3
{
if(key=='1') angleID=1;///NOW3
if(key=='2') angleID=2;///NOW3
if(key=='3') angleID=3;///NOW3
if(key=='4') angleID=4;///NOW3
if(key=='w' || key=='W'){///NOW4 小寫的 w
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
}
if(key=='r'){///NOW5
if(fin==NULL) fin = fopen("motion.txt", "r");///NOW5
for(int i=0; i<20;i++){///NOW5
fscanf(fin, "%f", &angle[i]);///NOW5
}///NOW5
}
glutPostRedisplay();///和 display()很像,但更好 ///NOW5
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutKeyboardFunc(keyboard);///NOW3
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
#include <GL/glut.h>
FILE * fout=NULL;///(1) ///NOW4
FILE * fin =NULL;///(1) ///NOW5
float angle[20];///NOW
int angleID=1;///第幾個要轉動的關節 ///NOW3
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();///body
glColor3f(1,1,1);///white
glutSolidTeapot( 0.3 );///body
glPushMatrix();///right Arm
glTranslatef(0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[1], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[2], 0,0,1);///(2)轉動 ///NOW
glTranslatef(0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///right lower arm
glPopMatrix();
glPopMatrix();
glPushMatrix();///left Arm
glTranslatef(-0.18, 0, 0);///(3)掛到肩上
glRotatef(angle[3], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left upper arm
glPushMatrix();///NOW2 長出下手臂
glTranslatef(-0.18, 0, 0);///(3)掛到肘上
glRotatef(angle[4], 0,0,1);///(2)轉動 ///NOW
glTranslatef(-0.18, 0, 0);///(1)改變旋轉中心,放到中心
glColor3f(1,0,0);///red
glutSolidTeapot( 0.2 );///left lower arm
glPopMatrix();
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
int oldX;///NOW
void mouse(int button, int state, int x, int y)///NOW
{
oldX = x;///NOW
}
void motion(int x, int y)///NOW
{
angle[angleID] += (x-oldX);///NOW ///NOW3
oldX = x;///NOW
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
display();///NOW
}
void keyboard(unsigned char key, int x, int y)///NOW3
{
if(key=='1') angleID=1;///NOW3
if(key=='2') angleID=2;///NOW3
if(key=='3') angleID=3;///NOW3
if(key=='4') angleID=4;///NOW3
if(key=='w' || key=='W'){///NOW4 小寫的 w
if(fout==NULL) fout=fopen("motion.txt", "w+");///NOW4
for(int i=0; i<20; i++){///NOW4
printf( "%.1f ", angle[i]);///NOW4
fprintf( fout, "%.1f ", angle[i]);///NOW4
}
printf("\n");///NOW4
fprintf(fout, "\n");///NOW4
}
if(key=='r'){///NOW5
if(fin==NULL) fin = fopen("motion.txt", "r");///NOW5
for(int i=0; i<20;i++){///NOW5
fscanf(fin, "%f", &angle[i]);///NOW5
}///NOW5
}
glutPostRedisplay();///和 display()很像,但更好 ///NOW5
}
int main(int argc, char**argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
///glutInitWindowSize(600,600);///我們可以開很大的視窗
glutCreateWindow("week 13 motion TRT angle file");
glutKeyboardFunc(keyboard);///NOW3
glutMouseFunc(mouse);///NOW
glutMotionFunc(motion);///NOW
glutDisplayFunc(display);
glutMainLoop();
}
\成品圖/
2019年5月10日 星期五
ㄟOWOㄏ - Week12
{\__/}
( • - •)
< \\今天要來加入聲音/
STEP 1 → 先開CodeBlocks,並開啟新專案,選擇Console application。
STEP 2 → 對專案按右鍵,選取紅框。
STEP 3 → 到Linker settings按Add增加winmm。
#include <windows.h>
#include <mmsystem.h>
int main()
{
PlaySoundA("C:\\Users\\user\\Downloads\\wind.wav",NULL,SND_SYNC);
return 0;
}
\再來就加上鍵盤應用做個小鋼琴吧/
STEP 1 → 開啟GLUT專案。
STEP 2 → 在原本專案大概90幾行的static void key(unsigned char key, int x, int y)裡加上
if(key=='1') PlaySoundA("C:\\Users\\user\\Downloads\\DO.wav",NULL,SND_ASYNC);
以上那行程式碼,所有需變動再自行調整。
\注意事項/
1.記得加#include <mmsystem.h>
2.記得檢查音檔是wav檔
3.注意檔案位置是否正確
1.記得加#include <mmsystem.h>
2.記得檢查音檔是wav檔
3.注意檔案位置是否正確
\讀入MP3檔/
在最前面加上
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
int a;
float b;
char c;
double d;
在後面的int main裡面加上
myMP3.Load("C:\\Users\\user\\Downloads\\POPSTARS.mp3");
myMP3.Play();
特別注意 ! mp3的檔名裡不可有空白鍵!
2019年5月3日 星期五
ㄟOWOㄏ - Week11
{\__/}
( • - •)
< \\實作TRT成品圖/

注意事項 : 同一隻手的上下臂要放在同個glPushMatrix和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.5, 0.15, 0);///(3) 掛在身體的右肩
glRotatef(angle1, 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(angle2, 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.45, 0.15, 0);///(3) 掛在身體的左肩
glRotatef(angle3, 0,0,-1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW3
glTranslatef(0.2, 0, 0);///(3) 掛在身體的左肘///NOW3
glRotatef(angle4, 0,0,-1);///(2) 旋轉///NOW3
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW3
glColor3f(1,0,0);///紅色的///NOW3
glutSolidTeapot( 0.15 );///左下手臂///NOW3
glPopMatrix();///NOW3
glPopMatrix();
glPushMatrix();///右邊腳
glTranslatef(0.15, -0.25, 0);///(3) 掛在身體的右腳
glRotatef(angle1, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右腳
glPushMatrix();///NOW4
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右膝///NOW4
glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW4
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4
glColor3f(1,0,0);///紅色的///NOW4
glutSolidTeapot( 0.15 );///右小腿///NOW4
glPopMatrix();///NOW4
glPopMatrix();
glPushMatrix();///左邊腳
glTranslatef(-0.15, -0.25, 0);///(3) 掛在身體的左腳
glRotatef(angle3, 0,0,-1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左腳
glPushMatrix();///NOW5
glTranslatef(0.2, 0, 0);///(3) 掛在身體的左膝///NOW5
glRotatef(angle4, 0,0,-1);///(2) 旋轉///NOW5
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW5
glColor3f(1,0,0);///紅色的///NOW5
glutSolidTeapot( 0.15 );///左小腿///NOW5
glPopMatrix();///NOW5
glPopMatrix();
glutSwapBuffers();
//angle++;///NOW//變成滑鼠旋轉
}
int oldX,oldY;
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)
{
oldX=x;
oldY=y;
}
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
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
\來看看程式碼/
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.5, 0.15, 0);///(3) 掛在身體的右肩
glRotatef(angle1, 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(angle2, 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.45, 0.15, 0);///(3) 掛在身體的左肩
glRotatef(angle3, 0,0,-1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左手臂
glPushMatrix();///NOW3
glTranslatef(0.2, 0, 0);///(3) 掛在身體的左肘///NOW3
glRotatef(angle4, 0,0,-1);///(2) 旋轉///NOW3
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW3
glColor3f(1,0,0);///紅色的///NOW3
glutSolidTeapot( 0.15 );///左下手臂///NOW3
glPopMatrix();///NOW3
glPopMatrix();
glPushMatrix();///右邊腳
glTranslatef(0.15, -0.25, 0);///(3) 掛在身體的右腳
glRotatef(angle1, 0,0,1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///右腳
glPushMatrix();///NOW4
glTranslatef(0.2, 0, 0);///(3) 掛在身體的右膝///NOW4
glRotatef(angle2, 0,0,1);///(2) 旋轉///NOW4
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW4
glColor3f(1,0,0);///紅色的///NOW4
glutSolidTeapot( 0.15 );///右小腿///NOW4
glPopMatrix();///NOW4
glPopMatrix();
glPushMatrix();///左邊腳
glTranslatef(-0.15, -0.25, 0);///(3) 掛在身體的左腳
glRotatef(angle3, 0,0,-1);///(2) 旋轉
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸
glColor3f(1,0,0);///紅色的
glutSolidTeapot( 0.15 );///左腳
glPushMatrix();///NOW5
glTranslatef(0.2, 0, 0);///(3) 掛在身體的左膝///NOW5
glRotatef(angle4, 0,0,-1);///(2) 旋轉///NOW5
glTranslatef(0.15, 0,0);///(1) 把茶壼柄,移動到畫面的中心,當旋轉軸///NOW5
glColor3f(1,0,0);///紅色的///NOW5
glutSolidTeapot( 0.15 );///左小腿///NOW5
glPopMatrix();///NOW5
glPopMatrix();
glutSwapBuffers();
//angle++;///NOW//變成滑鼠旋轉
}
int oldX,oldY;
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)
{
oldX=x;
oldY=y;
}
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
glutKeyboardFunc(keyboard);///NOW6 配合鍵盤
glutMainLoop();
}
訂閱:
文章 (Atom)

