顯示具有 06160485_曾宏鈞 標籤的文章。 顯示所有文章
顯示具有 06160485_曾宏鈞 標籤的文章。 顯示所有文章

2019年5月31日 星期五

alanhc/張牧之 電腦圖學-week15

投影法
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 可以看到範圍比較大的投影法
modelview矩陣
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
「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. 小葉閒聊

0. 計時器

解釋

glutTimerFunc(持續時間, 呼叫的timer函式, 在第幾秒);

實作

1. include #include
2. 放音樂在 freeglut/bin
3. 寫程式
main() 放入
glutTimerFunc(1000, timer, 0);
新憎程式
void timer(int t)
{
PlaySoundA("carhn[1].wav", NULL, SND_ASYNC);
}
Q 如果要馬上播呢?
A. 加入這行
void timer(int t)
{
glutTimerFunc(1000, timer, t+1); ///馬上播 < 就是這行
printf("%d \n", t);
PlaySoundA("carhn[1].wav", NULL, SND_ASYNC);
}

1.影格

介紹

FPS
一般來我們是30fps
因此每秒會有30張











recall 大一flash設計
重要概念:關鍵影格








因此,重要個部份來了
這背後到底怎麼做的?????

> 數學!!! 內插法(Interpolation)

2.內插 / 插值(Interpolation)

看張圖理解


公式 [ 參考資料1wiki ] [ 參考資料2 stackexchange ] [ 超詳細! ]


口訣:

座標  = alpha * 新+ (1-alpha) * 舊

alpha 是 0~1的數字
新 配 alpha
舊 配 (1-alpha)
舊的是0
新的是1

Excel 算下去就對啦


alpha = t/30
內插: 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();
}
display() 的glTranslatef(nowX, 0,0);負責畫圖
由timer裡的nowX = alpha*1.0+(1-alpha) * -1.0算座標

3.改預設路徑(美麗的錯誤)


在專案資料夾會有個
/>改working_dir="."
所以會變這樣
/>然後
會出現這

因為路徑改掉了!!!去freeglut\bin下載回來即可

4.Dancing Time!!!

1. 移動模型 (擺好pose)
2. 紀錄 (recall 前面觀念的 關鍵影格)
3. 貼很多次 (變成動畫)
好像是 poping 還是 locking

Next > 使用Alpha compositing


筆記


影格的概念

讀檔

if (key=='t') {
    ///啟動timer
 
}

捕間動畫 > timer 

mlt材質
obj點




Q&A
glutPostRedisplay 跟glutMainLoop()講我需要一直檢查

5.小葉閒聊

14 now
15
X

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. include 
2. 路徑正確
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):

          講幾個有趣的
    • Stretching (拉)
    • (沿著x軸拉)
    • Squeezing (擠)
    • (擠壓)
    • Rotate (後面更詳細)

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%

今天的程式