2019電腦圖學 Computer Graphics 授課教師: 葉正聖 銘傳大學資訊傳播工程系 每週主題: 程式環境、點線面顏色、移動/旋轉/縮放與矩陣(Matrix)、階層性關節轉動(T-R-T)、做出機器人、打光、貼圖、glu/glut函式、鍵盤、滑鼠、計時器(timer)、讀入3D模型、粒子系統、聲音、特效、投影矩陣、攝影機與運鏡、機器人2.0、期末作品
2019年6月14日 星期五
2019年5月31日 星期五
alanhc/張牧之 電腦圖學-week15
投影法
Perspective

Ortho

Frustum

glu 進階函式

glm.h 裡面包含 glmReadOBJ(), glmDraw(), glmUnitized()


Michael bay rotating camera
https://www.youtube.com/watch?v=DPtHPgZmZdA


projection矩陣
modelview矩陣
草食性動物
>眼睛長在旁邊
肉食性動物
>眼睛長在前面



http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 裡 source
glm.c
glm.h
印度人 搖頭
https://www.youtube.com/watch?v=ZK1KdMU10pg
Perspective
Ortho
Frustum
glu 進階函式
glm.h 裡面包含 glmReadOBJ(), glmDraw(), glmUnitized()
glEnable(GL_DEPTH_TEST); ///有立體功能
GLfloat light_pos[] = { 0.0, 0.0, 1.0, 0.0 };
glEnable(GL_LIGHT0); ///NOW2 打光後變立體的彩色的
glEnable(GL_LIGHTING); ///NOW2 打光後變立體的彩色的
glLightfv(GL_LIGHT0, GL_POSITION, light_pos);///NOW2 打光的位置
Michael bay rotating camera
https://www.youtube.com/watch?v=DPtHPgZmZdA
projection矩陣
glMatrixMode(GL_PROJECTION);///NOW4
glLoadIdentity();///NOW4
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
草食性動物
>眼睛長在旁邊
肉食性動物
>眼睛長在前面


小葉閒聊
learning pyramid
http://www.cmlab.csie.ntu.edu.tw/~jsyeh/3dcg10/ 裡 source
glm.c
glm.h
印度人 搖頭
https://www.youtube.com/watch?v=ZK1KdMU10pg
2019年5月24日 星期五
alanhc/張牧之 電腦圖學-week14
0. 計時器
1. 影格
2. 內插 / 插值(Interpolation)
3. 改預設路徑(美麗的錯誤)
4. Dancing Time!!!
5. 小葉閒聊
1. 影格
2. 內插 / 插值(Interpolation)
3. 改預設路徑(美麗的錯誤)
4. Dancing Time!!!
5. 小葉閒聊
0. 計時器
解釋
glutTimerFunc(持續時間, 呼叫的timer函式, 在第幾秒);
實作
1. include #include
2. 放音樂在 freeglut/bin
3. 寫程式
main() 放入
2. 放音樂在 freeglut/bin
3. 寫程式
main() 放入
glutTimerFunc(1000, timer, 0);
新憎程式
Q 如果要馬上播呢?
A. 加入這行
void timer(int t)
{
PlaySoundA("carhn[1].wav", NULL, SND_ASYNC);
}
A. 加入這行
void timer(int t)
{
glutTimerFunc(1000, timer, t+1); ///馬上播 < 就是這行
printf("%d \n", t);
PlaySoundA("carhn[1].wav", NULL, SND_ASYNC);
}
recall 大一flash設計
重要概念:關鍵影格因此,重要個部份來了
這背後到底怎麼做的?????
> 數學!!! 內插法(Interpolation)
2.內插 / 插值(Interpolation)
看張圖理解
公式 [ 參考資料1wiki ] [ 參考資料2 stackexchange ] [ 超詳細! ]
口訣:
座標 = alpha * 新+ (1-alpha) * 舊
alpha 是 0~1的數字
新 配 alpha
舊 配 (1-alpha)
舊的是0
新的是1
用 Excel 算下去就對啦
alpha 是 0~1的數字
新 配 alpha
舊 配 (1-alpha)
舊的是0
新的是1
用 Excel 算下去就對啦
alpha = t/30
內插: alpha*新+(1-alpha)*舊

這樣就可以算出來拉哈哈哈
display() 的glTranslatef(nowX, 0,0);負責畫圖
由timer裡的nowX = alpha*1.0+(1-alpha) * -1.0算座標

在專案資料夾會有個
/>改working_dir="."內插: alpha*新+(1-alpha)*舊
這樣就可以算出來拉哈哈哈
程式
void display()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(nowX, 0,0);
glutSolidTeapot( 0.3 );
glPopMatrix();
glutSwapBuffers();
}
void timer(int t)
{
glutTimerFunc(30, timer, t+1); ///馬上播
printf("%d \n", t);
float alpha = (t%30) / 30.0;
nowX = alpha*1.0+(1-alpha) * -1.0;
glutPostRedisplay();
}
由timer裡的nowX = alpha*1.0+(1-alpha) * -1.0算座標
3.改預設路徑(美麗的錯誤)
在專案資料夾會有個
所以會變這樣
會出現這
因為路徑改掉了!!!去freeglut\bin下載回來即可
4.Dancing Time!!!
1. 移動模型 (擺好pose)
2. 紀錄 (recall 前面觀念的 關鍵影格)
3. 貼很多次 (變成動畫)好像是 poping 還是 locking
Next > 使用Alpha compositing
筆記
影格的概念
讀檔
if (key=='t') {
///啟動timer
}
if (key=='t') {
///啟動timer
}
捕間動畫 > timer
mlt材質
obj點
obj點
Q&A
glutPostRedisplay 跟glutMainLoop()講我需要一直檢查
glutPostRedisplay 跟glutMainLoop()講我需要一直檢查
5.小葉閒聊
14 now
15
X
17
imagine cup
https://www.geekwire.com/2019/microsoft-imagine-cup-winner-aims-transform-blood-glucose-monitoring-eye-testing-app/

imagine cup
https://www.geekwire.com/2019/microsoft-imagine-cup-winner-aims-transform-blood-glucose-monitoring-eye-testing-app/
今天的程式碼

2019年5月17日 星期五
alanhc/張牧之 電腦圖學-week13
寫檔
1. 新增指標 fout FILE * fout=NULL;2. 指定指標 fopen("檔名", 方式) 方式是 "w+"
3. 印到檔案 fprintf(指標, "要寫的東西")
1. File * fout=NULL
2. fout = fopen("filename.txt", "w+");
3. fprintf(fout, "hello world");
讀檔
1. 新增指標 fin FILE * fin =NULL;
2. 指定指標 fopen("檔名", 方式) 方式是 "r"
3. 讀檔案 fscanf(指標, "%s", line);
1. File * fin=NULL
2. fin = fopen("filename.txt", "r");
3. fscanf(fin, "hello world");
控制獨立關節轉動
1. main() 宣告
glutKeyboardFunc(keyboard);
2. 程式撰寫
> 使用一個 變數 angleID,
使 motion() 裡,陣列 angle[angleID]
可以控制 display() 裡的 angle[]
void motion(int x, int y)
{
angle[angleID] += (x-oldX);
oldX = x;
display();
}
void keyboard(unsigned char key, int x, int y)
{
if(key=='1') angleID=1;
if(key=='2') angleID=2;
if(key=='3') angleID=3;
if(key=='4') angleID=4;
}

紀錄/播放動作
紀錄
講解
> 使用寫檔 (參見前一章)
> 按下w開始 記錄(write)
> fprintf( 指標, "要印的東西" )
keyboard() 裡,加入以下程式
if (key=='w') {
if (fout==NULL) fout=fopen("motion.txt", "w+");
for (int i=0; i<5; i++) {
printf( "%.1f ", angle[i] );
fprintf( fout, "%.1f ", angle[i]);
}
printf("\n");
fprintf(fout, "\n");
}
if (fout==NULL) 檢查是否有開檔
for () 一次寫5個關節
在motion()裡面也加
if(fin==NULL) fin = fopen("motion.txt", "r");
for(int i=0; i<20;i++){
fscanf(fin, "%f", &angle[i]);
}
printf("\n");
fprintf(fout, "\n");
在freeglut\bin資料夾底下找 motion.txt 就可以找到剛剛紀錄的座標
講解
> 使用讀檔 (參見前一章)
> 按下r開始 記錄(write)
> fscanf( 指標, "要讀的東西" )
if(key=='r'){
if(fin==NULL) fin = fopen("motion.txt", "r");
for(int i=0; i<20;i++){
fscanf(fin, "%f", &angle[i]);
}
}
glutPostRedisplay();
*glutPostRedisplay(); 加上這 就會重新畫,否則只有按下鍵盤才畫
終於大功告成拉拉拉拉拉拉拉拉拉哈哈哈哈哈哈哈哈哈哈哈哈哈!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
小葉閒聊time
規劃的重要性unitize 轉成單位
分開存,才能分開畫
2019年5月10日 星期五
alanhc/張牧之 電腦圖學-week12
windows mmsystem.h有些需要
mmsystem multimedia system可播聲音
PlaySoundA("英文ASCII檔名", NULL, SND_SYNC)
(windows物件,windows物件,windows物件 )
wav檔下載
播放音樂
1. include2. 路徑正確
3. 寫程式
1. include
Debug Time
Q:
A:
build option > Linker setting > add library "winmm"
SND_ASYNC 聲音不等待同步
小工具
windows內建
小葉很炫技巧
dir *winmm* /s (搜尋所有子目錄)
小葉閒聊
總統盃黑客松細心
耐心、不甘心
問問題
小葉酷炫技巧
dir *winmm*
path
小葉cpe密技
每次讀兩行片語
英文題目
task 小階段解決
白紙
2019年5月3日 星期五
alanhc/張牧之 電腦圖學-week11
0. 小觀念:機器人&階層性關節轉動
1. Codding Time!!!
1-1.鏡射
1-2.滑鼠
1-3.小技巧-更新座標:
1-4.鍵盤
2.小葉閒聊Time
0. 小觀念:機器人&階層性關節轉動
>那是甚麼???0-1 機器人

- 機器人是由許多的 關節 連接 骨頭 組成
0-2 階層性關節

- 一層一層 的放入 stack 使其可以一起旋轉
- TRT旋轉是關鍵!!! >參考下圖TRT
TRT
TRT旋轉
1. Codding Time!!!
1-1鏡射
- 反轉 x座標
- 反轉 角度
- glRotatef(-angle, 0,0,1);glTranslatef(-x, 0,0);
乾坤大挪移~~~
1-2滑鼠
Past: glutMotionFunc()
Now: glutMotionFunc() + glutMouseFunc()
motion 與 mouse差別:
1-3小技巧-更新座標:
- 原理圖
- 程式觀點
void motion(int x, int y) ///new
{
angle += (x-oldX);
oldX=x; ///old
- 數字觀點
1-4鍵盤
void keyboard(unsigned char key, int x, int y)- key:按鍵
- x:按下時滑鼠x座標
- y:按下時滑鼠y座標
why unsigned? [ doc ] [ ref2 ]
>回家任務 使用陣列
2小葉閒聊Time
星星的孩子天賦
好的coding特質
- 細膩的眼神 觀察細微
- 龜毛 排版
- 偏執 死纏爛打
- 問問題 不恥下問
大學教授 > 內向 > 專注
2019年4月26日 星期五
alanhc/張牧之 電腦圖學-week10
0. 觀念1. 不同觀點看RT
2. 動動手寫程式
3. step by step 理解程式
4. 小葉閒聊Time
0. 觀念

看圖理解:
R-T
T-R
1. 不同觀點看RT
1-1 線性代數觀點:
超圖解!
複習線性代數(發現數學QQ):
- Transformation [ 參考資料Transformation ]
講幾個有趣的
- Rotation [ 參考資料 Rotation ]
2D
3D
[ 參考資料push matrix ]
1-2 程式觀點

程式:( display()裡 )
glPushMatrix();
glRotatef(90, 0,1,0); ///step 3
glTranslatef(0,0.5,0); ///step 2
glutSolidTeapot(0.3); ///step 1
glPopMatrix();
1-3 OpenGL觀點 [ 參考 ] - 4*4矩陣
基本運算規則

translation Matrix

Scaling

2. 動動手寫程式

程式
glPushMatrix();
glTranslatef(0.5,0.45,0); //step5
glRotatef(angle+=0.1,0,0,1); //step4
glTranslatef(0.6,0,0); //step3
glRotatef(-90,0,1,0); //step2
glutWireCone(0.3, 0.6, 10, 10); //step1
glPopMatrix();
3. step by step 理解程式
glutWireCone(0.3, 0.6, 10, 10);
glRotatef(-90,0,1,0);
glTranslatef(0.6,0,0);
glRotatef(angle+=0.1,0,0,1);
glTranslatef(0.5,0.45,0);
4. 小葉閒聊Time:
學習率:看 5 %
看+課本 15%
看+課本+demo 25%
看+課本+demo+動手 30%
多媒體互動 40%
教別人 90% 95%
今天的程式
訂閱:
文章 (Atom)









