https://youtu.be/5u23E4blYX8
2018電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2018年6月11日 星期一
2018年6月4日 星期一
Week 15 ADDONE notes
主題: 學期內容回顧
glutSolidSphere(1,slices,stacks);SolidSphere實心圓
(1,slices,stacks) : (半徑,切,切)
glutSolidCone(1,1,slices,stacks); 錐體
glutSolidTorus(0.2,0.8,slices,stacks);甜甜圈形
glutWireSphere(1,slices,stacks);空心圓
貼圖


音樂播放
void mouse (int button,int state, int x,int y);
{
if(state==GLUT_DOWN) PlaySound("Shot.wav",NULL, SND_ASYNC);
}
//按滑鼠就會播聲音
音樂檔要放入 freeglut的bin裡面
moodle下載 CMP3_MCI.h 放在自己建立的coldblock檔裡就可以播MP3
myMP3.Load("123.mp3");
myMP3.play();
2018年5月28日 星期一
Week 14 ADDONE notes
主題:攝影機、投影矩陣
下載 [source][data][win32] glut32.dll將[win32]解壓縮
將glut32.dll [data] 放入window資料夾

透視投影
fovy:張開的角度
aspect:長寬比例
zNear:近的裁一刀
zFar:遠的一刀


#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL; ///(0)宣告檔案的指標,一開始是空的
float angle=60, angle2=90, angle3=60; ///準備3個角度的值
void keyboard(unsigned char key, int x, int y)
{
if(key=='s' || key=='S' || key=='w' || key=='W'){
if(fout==NULL) fout=fopen("output.txt", "w+");
///上面這行,只有第一次按s鍵,才會還沒有值,才fopen
///因為第二次按s鍵,fout名花有主,不會再重覆開檔案
printf("%.3f %.3f %.3f\n", angle,angle2,angle3);
fprintf(fout, "%.3f %.3f %.3f\n", angle,angle2,angle3);
}///3個角度的值,印到檔案去
}
///打光的陣列之前全部刪掉, 陣列不要刪
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
///Now: 要畫東西
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSolidTeapot(0.3);///Now:身體
glPushMatrix(); ///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glTranslatef(0.4, 0, 0); ///Now:(3) 掛在右邊
glRotatef(angle, 0,0,1); ///Now:(2) angle的轉動角度,對Z軸
glTranslatef(0.4, 0, 0); ///Now:(1) 往右移,讓手把在中間
glutSolidTeapot(0.3); ///Now:右手臂
glPopMatrix(); ///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glPopMatrix(); ///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSwapBuffers();
}
void motion(int x, int y)///Now:
{///Now:
angle = x;///Now: 角度會隨mouse motion而改值
glutPostRedisplay();///Now:
}///Now:
static void resize(int width, int height)
{
const float ar = (float) width / (float) height;///aspect rotio 長寬比
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
gluLookAt(0,3,1, 0,0,0, 0,1,0);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutMotionFunc(motion);///Now: 加上motion事件
glutKeyboardFunc(keyboard);
///glutKeyboardFunc(key);
///glutIdleFunc(idle);
glClearColor(1,1,1,1);
///glEnable(GL_CULL_FACE);
///glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}
作業四講解
#include <GL/glut.h>
#include <stdio.h>///要檔案
FILE * fout=NULL;///(0)宣告檔案的指標,一開始是空的
//float angle=60, angle2=90, angle3=60;///準備3個角度的值
float angle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int ID=0;
float oldAngle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
float newAngle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void timer (int t)
{
printf("%d\n",t);
glutTimerFunc(30,timer,t+1);
if(t%100==0)
{
if(fin==NULL) fin =fopen("output.txt","r");
for(int i=0; i<20; i++)
{
oldAngle[i]= newAngle[i];
fscanf(fin,"%f",&newAngle[i]);
}
}
float alpha =(t%100)/100.0;
for(int i=0; i<20; i++)
{
angle[i]=newAngle[i]*alpha+oldAngle[i]*(1-alpha);
}
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='1') ID=1;
if(key=='1') ID=2;
if(key=='1') ID=3;
if(key=='1') ID=4;
if(key=='1') ID=5;
if(key=='1') ID=6;
if(key=='1') ID=7;
if(key=='1') ID=8;
if(key=='1') ID=9;
if(key=='1') ID=0;
if(key=='s' || key=='S' || key=='w' || key=='W')
{
if(fout==NULL) fout=fopen("output.txt", "w+");
///上面這行,只有第一次按s鍵,才會還沒有值,才fopen
///因為第二次按s鍵,fout名花有主,不會再重覆開檔案
//printf("%.3f %.3f %.3f\n", angle,angle2,angle3);
//fprintf(fout, "%.3f %.3f %.3f\n", angle,angle2,angle3);
for(int i=0; i<20; i++)
{
printf("%.3f",angle[i]);
fprintf(fout,"%.3f",angle[i]);
}
fprintf(fout,"\n");
}///3個角度的值,印到檔案去
if(key=='r')
{
if(fin==NULL) fin=fopen("output.txt","r");
for(int i=0; i<20; i++)
{
fscanf(fin,"%f",&angle[i]);
printf("%.3f",angle[i]);
}
}
if(key=='p')
{
glutTimerFunc(0,timer,0);
}
}
///打光的陣列之前全部刪掉, 陣列不要刪
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
///Now: 要畫東西
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSolidTeapot(0.3);///Now:身體
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glTranslatef(0.4, 0, 0);///Now:(3) 掛在右邊
glRotatef(angle, 0,0,1);///Now:(2) angle的轉動角度,對Z軸
glTranslatef(0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
glutSolidTeapot(0.3); ///Now:右手臂
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSwapBuffers();
}
void motion(int x, int y)///Now:
{
///Now:
angle = x;///Now: 角度會隨mouse motion而改值
glutPostRedisplay();///Now:
}///Now:
static void resize(int width, int height)
{
const float ar = (float) width / (float) height;///aspect rotio 長寬比
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
gluLookAt(0,3,1, 0,0,0, 0,1,0);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutMotionFunc(motion);///Now: 加上motion事件
glutKeyboardFunc(keyboard);
///glutKeyboardFunc(key);
///glutIdleFunc(idle);
glClearColor(1,1,1,1);
//glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}
#include <GL/glut.h>
#include <stdio.h>///要檔案
FILE * fout=NULL;///(0)宣告檔案的指標,一開始是空的
//float angle=60, angle2=90, angle3=60;///準備3個角度的值
float angle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int ID=0;
float oldAngle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
float newAngle[20]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
void timer (int t)
{
printf("%d\n",t);
glutTimerFunc(30,timer,t+1);
if(t%100==0)
{
if(fin==NULL) fin =fopen("output.txt","r");
for(int i=0; i<20; i++)
{
oldAngle[i]= newAngle[i];
fscanf(fin,"%f",&newAngle[i]);
}
}
float alpha =(t%100)/100.0;
for(int i=0; i<20; i++)
{
angle[i]=newAngle[i]*alpha+oldAngle[i]*(1-alpha);
}
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='1') ID=1;
if(key=='1') ID=2;
if(key=='1') ID=3;
if(key=='1') ID=4;
if(key=='1') ID=5;
if(key=='1') ID=6;
if(key=='1') ID=7;
if(key=='1') ID=8;
if(key=='1') ID=9;
if(key=='1') ID=0;
if(key=='s' || key=='S' || key=='w' || key=='W')
{
if(fout==NULL) fout=fopen("output.txt", "w+");
///上面這行,只有第一次按s鍵,才會還沒有值,才fopen
///因為第二次按s鍵,fout名花有主,不會再重覆開檔案
//printf("%.3f %.3f %.3f\n", angle,angle2,angle3);
//fprintf(fout, "%.3f %.3f %.3f\n", angle,angle2,angle3);
for(int i=0; i<20; i++)
{
printf("%.3f",angle[i]);
fprintf(fout,"%.3f",angle[i]);
}
fprintf(fout,"\n");
}///3個角度的值,印到檔案去
if(key=='r')
{
if(fin==NULL) fin=fopen("output.txt","r");
for(int i=0; i<20; i++)
{
fscanf(fin,"%f",&angle[i]);
printf("%.3f",angle[i]);
}
}
if(key=='p')
{
glutTimerFunc(0,timer,0);
}
}
///打光的陣列之前全部刪掉, 陣列不要刪
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
///Now: 要畫東西
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSolidTeapot(0.3);///Now:身體
glPushMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glTranslatef(0.4, 0, 0);///Now:(3) 掛在右邊
glRotatef(angle, 0,0,1);///Now:(2) angle的轉動角度,對Z軸
glTranslatef(0.4, 0, 0);///Now:(1) 往右移,讓手把在中間
glutSolidTeapot(0.3); ///Now:右手臂
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glPopMatrix();///Now:像大括號一樣,把裡面的移動/旋轉,控制在裡面,不要影響到外面
glutSwapBuffers();
}
void motion(int x, int y)///Now:
{
///Now:
angle = x;///Now: 角度會隨mouse motion而改值
glutPostRedisplay();///Now:
}///Now:
static void resize(int width, int height)
{
const float ar = (float) width / (float) height;///aspect rotio 長寬比
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
gluLookAt(0,3,1, 0,0,0, 0,1,0);
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutMotionFunc(motion);///Now: 加上motion事件
glutKeyboardFunc(keyboard);
///glutKeyboardFunc(key);
///glutIdleFunc(idle);
glClearColor(1,1,1,1);
//glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}
2018年5月21日 星期一
Week 13 ADDONE notes
主題: 寫檔 讀檔
主題: 控制關節
主題: 動作內插
開檔 fopen




#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;
float angle=0;
int oldX;
void mouse(int button ,int state, int x,int y)
{
oldX=x;
}
void motion(int x,int y)
{
angle+= x-oldX;
oldX=x;
if(fout==NULL)
{
fout=fopen("output.txt","w+");
}
fprintf(fout,"%.3f\n",angle);
printf("%.3f\n",angle);
glutPostRedisplay();
}
void display()///以下是老師提供的
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glutSolidTeapot(0.3);///正中間,當成身體的茶壼
glPushMatrix();
glTranslatef(0.4, 0,0);///掛上去
glRotatef(angle, 0,0,1);///
glTranslatef(0.4, 0,0);///把柄放中間
glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
///上面是我們增加的程式碼
///打光的部分留著 (陣列,main() ) 其他都刪掉
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutMouseFunc(mouse);
glutMotionFunc(motion);
///glutReshapeFunc(resize);
glutDisplayFunc(display);
///glutKeyboardFunc(key);
///glutIdleFunc(idle);
glClearColor(1,1,1,1);
///glEnable(GL_CULL_FACE);
///glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}


#include <GL/glut.h>
#include <stdio.h>
FILE * fout=NULL;
FILE * fin=NULL;
float angle=0;
int oldX;
void keyboard(unsigned char key, int x, int y)
{
if(fin ==NULL)
{
fin =fopen("output.txt","r");
}
fscanf(fin, "%f",&angle);
glutPostRedisplay();
}
void mouse(int button ,int state, int x,int y)
{
oldX=x;
}
void motion(int x,int y)
{
angle+= x-oldX;
oldX=x;
if(fout==NULL)
{
fout=fopen("output.txt","w+");
}
fprintf(fout,"%.3f\n",angle);
printf("%.3f\n",angle);
glutPostRedisplay();
}
void display()///以下是老師提供的
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glutSolidTeapot(0.3);///正中間,當成身體的茶壼
glPushMatrix();
glTranslatef(0.4, 0,0);///掛上去
glRotatef(angle, 0,0,1);///
glTranslatef(0.4, 0,0);///把柄放中間
glutSolidTeapot(0.3);///右邊,當成手臂的茶壼
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
///上面是我們增加的程式碼
///打光的部分留著 (陣列,main() ) 其他都刪掉
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutMouseFunc(mouse);
glutMotionFunc(motion);
///glutReshapeFunc(resize);
glutDisplayFunc(display);
///glutKeyboardFunc(key);
///glutIdleFunc(idle);
glClearColor(1,1,1,1);
///glEnable(GL_CULL_FACE);
///glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}






2018年5月14日 星期一
Week 12 ADDONE notes
(1) T-R-T關節轉動
(2) PlaySound() , MP3播放
(3) 主題:計時器
(4) 內插,線性內插,動畫。
1.到moodle 下載 : freeglut,音樂, CMP3_MCI.h 2.改Project的.....cbp檔 "bin" 改成 "."
3.把freeglut CMP3_MCI.h MP3 檔放在Project裡
3.把freeglut CMP3_MCI.h MP3 檔放在Project裡

計時器

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
#include <stdlib.h>
static int slices = 16;
static int stacks = 16;
/* GLUT callback Handlers */
static void resize(int width, int height)
{
const float ar = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}
static void display(void)
{
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double a = t*90.0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3d(1,0,0);
glPushMatrix();
glTranslated(-2.4,1.2,-6);
glRotated(60,1,0,0);
glRotated(a,0,0,1);
glutSolidSphere(1,slices,stacks);
glPopMatrix();
glPushMatrix();
glTranslated(0,1.2,-6);
glRotated(60,1,0,0);
glRotated(a,0,0,1);
glutSolidCone(1,1,slices,stacks);
glPopMatrix();
glPushMatrix();
glTranslated(2.4,1.2,-6);
glRotated(60,1,0,0);
glRotated(a,0,0,1);
glutSolidTorus(0.2,0.8,slices,stacks);
glPopMatrix();
glPushMatrix();
glTranslated(-2.4,-1.2,-6);
glRotated(60,1,0,0);
glRotated(a,0,0,1);
glutWireSphere(1,slices,stacks);
glPopMatrix();
glPushMatrix();
glTranslated(0,-1.2,-6);
glRotated(60,1,0,0);
glRotated(a,0,0,1);
glutWireCone(1,1,slices,stacks);
glPopMatrix();
glPushMatrix();
glTranslated(2.4,-1.2,-6);
glRotated(60,1,0,0);
glRotated(a,0,0,1);
glutWireTorus(0.2,0.8,slices,stacks);
glPopMatrix();
glutSwapBuffers();
}
static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 27 :
case 'q':
exit(0);
break;
case '+':
slices++;
stacks++;
break;
case '-':
if (slices>3 && stacks>3)
{
slices--;
stacks--;
}
break;
}
glutPostRedisplay();
}
static void idle(void)
{
glutPostRedisplay();
}
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
/* Program entry point */
#include <mmsystem.h>
#include <stdio.h>
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
void timer(int t)
{
glutTimerFunc(2000,timer,0); //2000=2秒再播放
PlaySound("Shot.wav",NULL,SND_ASYNC);
}
int main(int argc, char *argv[])
{
myMP3.Load("MJThriller.mp3");
myMP3.Play();
///PlaySound("BigDog.mp3", NULL, SND_ASYNC);
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutKeyboardFunc(key);
glutIdleFunc(idle);
glutTimerFunc(7000,timer,0);//7000=7秒後播放
glClearColor(1,1,1,1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}
內插法




#include <Gl/glut.h>
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
float angle=0;
float alpha=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glutSolidTeapot(0.3);
glPushMatrix();
glTranslatef(0.4,0,0);
glRotatef(angle,0,0,1);
glTranslatef(0.4,0,0);
glutSolidTeapot(0.3);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
#include <mmsystem.h>
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
void timer(int t)
{
glutTimerFunc(50,timer,t+1);
alpha = t/100.0;
angle = alpha*90 + (1-alpha)*0;
glutPostRedisplay();
///PlaySound("Shot.wav",NULL,SND_ASYNC);
}
int main(int argc, char *argv[])
{
myMP3.Load("MJThriller.mp3");
myMP3.Play();
///PlaySound("BigDog.mp3", NULL, SND_ASYNC);
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutTimerFunc(1000,timer,0);
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat high_shininess[] = { 100.0f };
float angle=0;
float alpha=0;
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glutSolidTeapot(0.3);
glPushMatrix();
glTranslatef(0.4,0,0);
glRotatef(angle,0,0,1);
glTranslatef(0.4,0,0);
glutSolidTeapot(0.3);
glPopMatrix();
glPopMatrix();
glutSwapBuffers();
}
#include <mmsystem.h>
#include "CMP3_MCI.h"
CMP3_MCI myMP3;
void timer(int t)
{
glutTimerFunc(50,timer,t+1);
alpha = t/100.0;
angle = alpha*90 + (1-alpha)*0;
glutPostRedisplay();
///PlaySound("Shot.wav",NULL,SND_ASYNC);
}
int main(int argc, char *argv[])
{
myMP3.Load("MJThriller.mp3");
myMP3.Play();
///PlaySound("BigDog.mp3", NULL, SND_ASYNC);
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("GLUT Shapes");
glutDisplayFunc(display);
glutTimerFunc(1000,timer,0);
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glEnable(GL_LIGHT0);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
glutMainLoop();
return EXIT_SUCCESS;
}
1.MP3播放
變更Project中的cbp檔,把bin改成 .
2.計時器
訂閱:
文章 (Atom)














