期末作品
https://www.youtube.com/watch?v=EEkIDfpf5GE
2018電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2018年6月24日 星期日
2018年6月22日 星期五
week15 阮致峰
(下週要交期末作品)
複習:
Week01 :
(1)建WebGL專案
(2)跑OPENGL專案
Week02 :
(1)建GLUT專案(要有freeglut.dll)
(2)將GLUT專案(六個圖)的177行程式碼縮減約20行
(3) 用10行寫出茶壺 ( glutSolidTeapot ( x ) )
Week03 :移動(translatef) 旋轉(rotatef) 放大縮小(scalef)
glutSolidTeapot(半徑)
glutSolidSphere(半徑,切,切)
glutSolidCone(o,o,o)
Week04 : 旋轉(Rotate),矩陣(Matrix)
Week05 : T-R-T特定軸轉動(TRT之後才能做旋轉)
Week06 : glm 3D模型
#include"glm.h"
GLM * pmodel=NULL
if(pmodel==NULL)
{
glmReadOBJ("....")
glmUnitize()///縮放
}
glmDraw("pmodel");///畫出pmodel
*****舊的strdup()會不相容
複習:
Week01 :
(1)建WebGL專案
(2)跑OPENGL專案
Week02 :
(1)建GLUT專案(要有freeglut.dll)
(2)將GLUT專案(六個圖)的177行程式碼縮減約20行
(3) 用10行寫出茶壺 ( glutSolidTeapot ( x ) )
Week03 :移動(translatef) 旋轉(rotatef) 放大縮小(scalef)
glutSolidTeapot(半徑)
glutSolidSphere(半徑,切,切)
glutSolidCone(o,o,o)
Week04 : 旋轉(Rotate),矩陣(Matrix)
Week05 : T-R-T特定軸轉動(TRT之後才能做旋轉)
Week06 : glm 3D模型
#include"glm.h"
GLM * pmodel=NULL
if(pmodel==NULL)
{
glmReadOBJ("....")
glmUnitize()///縮放
}
glmDraw("pmodel");///畫出pmodel
*****舊的strdup()會不相容
Week07 :
(1)CodeBlocks>setting->compiler設定要對才可以運行glm.cpp compiler
(2)working_dir設成"."(儲存路徑)
(3)libfreeglut.dll 專案目錄copy
(2)working_dir設成"."(儲存路徑)
(3)libfreeglut.dll 專案目錄copy
Week08 :
(1)模型打光
(2)陣列
Week10 :貼圖:OpenCV (在moodle的moodle上課所需的軟體可以載)
(1)安裝OpenCV
(2)設目錄link
(3)完成
(2)設目錄link
(3)完成
Week11 :
(1)鍵盤鋼琴
(2)貼上聲音
week14 阮致峰
1.

到jsyeh.org/3dcg10下載window data glut32.dll
2.
gluPerspective( fovy, aspecy zNear, zFar)
fovy:張開角度
aspecy:長寬比
zNear:近的
zFar:遠的
glutReshapeFunc(resize);
改變視窗大小時,圖不會變形
Step3:
GLUT專案

到jsyeh.org/3dcg10下載window data glut32.dll
2.
gluPerspective( fovy, aspecy zNear, zFar)
fovy:張開角度
aspecy:長寬比
zNear:近的
zFar:遠的
glutReshapeFunc(resize);
改變視窗大小時,圖不會變形
Step3:
GLUT專案
tatic 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() ;
gluLookAt(0,3,3, 0,0,0, 0,1,0);
}
2018年5月21日 星期一
week13 阮致峰
1.開啟新的codeblocks

2.輸入程式碼
#include <stdio.h>
int main()
{
FILE * fout = fopen("output.txt","w+");
printf("Hellow world\n");
fprintf(fout,"Hellow world\n");
}

3.讀入角度
#include <stdio.h>
float angle=0,angle2=10,angle3=90;
int main()
{
FILE * fout = fopen("output.txt","w+");
///printf("Hellow world\n");
fprintf(fout,"%.3f %.3f %.3f\n",angle,angle2,angle3);
}

4.寫程式碼 讓茶壺可以拉動
#include <GL/glut.h>
#include <stdio.h>
float angle=0;
int oldX=0;
FILE * fout = NULL;
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;
}


2.輸入程式碼
#include <stdio.h>
int main()
{
FILE * fout = fopen("output.txt","w+");
printf("Hellow world\n");
fprintf(fout,"Hellow world\n");
}

3.讀入角度
#include <stdio.h>
float angle=0,angle2=10,angle3=90;
int main()
{
FILE * fout = fopen("output.txt","w+");
///printf("Hellow world\n");
fprintf(fout,"%.3f %.3f %.3f\n",angle,angle2,angle3);
}

4.寫程式碼 讓茶壺可以拉動
#include <GL/glut.h>
#include <stdio.h>
float angle=0;
int oldX=0;
FILE * fout = NULL;
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日 星期一
week12 阮致峰
複習上周內容(播聲音以及更改glut目錄)
#include <mmsystem.h>
PlaySound("Shot.wav",NULL,SND_ASYNC);
<Option working_dir="." />
""裡改成 .
解決 PlaySound(); 不能播 mp3 格式的問題
#include "CMP3_MCI.h" ///""代表在當前路徑的標頭檔
CMP3_MCI my; ///宣告一個 CMP3_MCI 的物件變數 叫 my
my.Load("Stop it. Get some help..mp3");
my.Play();
加入timer
glutTimerFunc();函式
內插公式: 交叉相乘
內插結合timer
2018年5月7日 星期一
week11 阮致峰
1. 從moodle下載上課用的檔案並拉到桌面

2.複製libfreeglut複製並改黨名

3.在網路上下載一個wav(聲音檔)要注意目錄

4.開glut檔

5.加入聲音的程式碼

6.這一行如果改成SND_SYNC會等人

7.開啟一個concole專案

8.加入外掛及聲音的程式碼(windows一定要在mmsystem前面)

9.開啟build option

10.新增winmm

11.把音檔加到自己的目錄

12.如果改成SND_ASYNC就不能太快結束 ------>(SND_SYNC要等 SND_ASYNC不要等)

13.輸入數字音樂就結束了(因為程式碼跑完了)

14.在glut那個專案裡新增鋼琴程式碼(鋼琴開始)
case '1' : PlaySound("Do.wav",NULL,SND_ASYNC);
break;
case '2' : PlaySound("Re.wav",NULL,SND_ASYNC);
break;
case '3' : PlaySound("Mi.wav",NULL,SND_ASYNC);
break;
case '4' : PlaySound("Fa.wav",NULL,SND_ASYNC);
break;
case '5' : PlaySound("Sol.wav",NULL,SND_ASYNC);
break;
case '6' : PlaySound("La.wav",NULL,SND_ASYNC);
break;
case '7' : PlaySound("Si.wav",NULL,SND_ASYNC);
break;

15.把音檔放入freeglut的資料夾(鋼琴結束)

16.從moodle下載lesson32(射擊遊戲開始)

17.借用wav檔

18.新增程式碼

19.按左鍵有Shot的聲音(射擊遊戲結束)

2.複製libfreeglut複製並改黨名

3.在網路上下載一個wav(聲音檔)要注意目錄

4.開glut檔

5.加入聲音的程式碼

6.這一行如果改成SND_SYNC會等人

7.開啟一個concole專案

8.加入外掛及聲音的程式碼(windows一定要在mmsystem前面)

9.開啟build option

10.新增winmm

11.把音檔加到自己的目錄

12.如果改成SND_ASYNC就不能太快結束 ------>(SND_SYNC要等 SND_ASYNC不要等)

13.輸入數字音樂就結束了(因為程式碼跑完了)

14.在glut那個專案裡新增鋼琴程式碼(鋼琴開始)
case '1' : PlaySound("Do.wav",NULL,SND_ASYNC);
break;
case '2' : PlaySound("Re.wav",NULL,SND_ASYNC);
break;
case '3' : PlaySound("Mi.wav",NULL,SND_ASYNC);
break;
case '4' : PlaySound("Fa.wav",NULL,SND_ASYNC);
break;
case '5' : PlaySound("Sol.wav",NULL,SND_ASYNC);
break;
case '6' : PlaySound("La.wav",NULL,SND_ASYNC);
break;
case '7' : PlaySound("Si.wav",NULL,SND_ASYNC);
break;

15.把音檔放入freeglut的資料夾(鋼琴結束)

16.從moodle下載lesson32(射擊遊戲開始)

17.借用wav檔

18.新增程式碼

19.按左鍵有Shot的聲音(射擊遊戲結束)
2018年4月30日 星期一
week10 阮致峰
1.到jsyeh.org/3dcg10下載data , windows32 , glut32.dll

2.解壓縮到windows , 複製glut32到windows資料夾裡 , 複製data到windows資料夾裡

3.到jsyeh.org/3dcg10下載source(到moodle下載opencv , freeglut)

4.把freeglut解壓縮到桌面 , 複製libfreeglut改成libglut32.a

5.開起codeblocks的glut專案後對專案點右鍵開啟build options

6.在Search dirctories的compiler新增目錄

7.在Linker settings新增

8.在Search dirctories的Linker新增目錄

9.在網路上找一張圖片(改名為image,因為程式讀檔是讀名為image的檔案)
並把檔案放在C:\Users\user\Desktop\freeglut\bin

10.寫程式讀入圖片
(#include <opencv/highgui.h>)
IplImage * img = cvLoadImage("image.png");///宣告指標,讀入圖檔(附檔名也要一樣)
cvNamedWindow("week10opencv");
cvShowImage("week10opencv",img);
cvWaitKey(0);

11.測試


結果:會先讀入圖片,再跑程式碼
/
/
/
/
/
/
/
/
/
/
//
1.從moodle下載earth

2.複製freeglut.dll和一張名為image的圖片到myEarth的資料夾裡

3.如果要改附檔名或檔名要用codeblocks開(直接把myEarth.cbp拉進去然後再改上面6~8步驟)
後,進入bin把myEarth新檔拉出來覆蓋舊檔就可以執行了

4.執行


2.解壓縮到windows , 複製glut32到windows資料夾裡 , 複製data到windows資料夾裡

3.到jsyeh.org/3dcg10下載source(到moodle下載opencv , freeglut)

4.把freeglut解壓縮到桌面 , 複製libfreeglut改成libglut32.a

5.開起codeblocks的glut專案後對專案點右鍵開啟build options

6.在Search dirctories的compiler新增目錄

7.在Linker settings新增

8.在Search dirctories的Linker新增目錄

9.在網路上找一張圖片(改名為image,因為程式讀檔是讀名為image的檔案)
並把檔案放在C:\Users\user\Desktop\freeglut\bin

10.寫程式讀入圖片
(#include <opencv/highgui.h>)
IplImage * img = cvLoadImage("image.png");///宣告指標,讀入圖檔(附檔名也要一樣)
cvNamedWindow("week10opencv");
cvShowImage("week10opencv",img);
cvWaitKey(0);

11.測試


結果:會先讀入圖片,再跑程式碼
/
/
/
/
/
/
/
/
/
/
//
1.從moodle下載earth

2.複製freeglut.dll和一張名為image的圖片到myEarth的資料夾裡

3.如果要改附檔名或檔名要用codeblocks開(直接把myEarth.cbp拉進去然後再改上面6~8步驟)
後,進入bin把myEarth新檔拉出來覆蓋舊檔就可以執行了

4.執行

訂閱:
文章 (Atom)








