專題製作:
基本完成
2018年1月27日 星期六
2018年1月15日 星期一
Claire 的課堂作業 week17
計算機圖學 Computer Graphics
- 主題:期末作品 Q & A
2D Tetris 進度:
從上禮拜獲得老師的Q&A到今天已經大致上完成了整個俄羅斯方塊的操作,
剩下要完成的項目有...
- 顯示關卡、分數
- 貼圖
- 配樂
課堂上在找OpenCV怎麼安裝到Xcode上
大部分找到的資料都是類似這樣:Link
但似乎是改版了,現在直接下載下來只能看到opencv2.framework
但加入外部Library又不給用 ...
進度:暫時用terminal顯示分數
2018年1月14日 星期日
2018年1月13日 星期六
圖學筆記乄Week17
專題製作
解決上周困難: 打光問題
=>打光重點:法向量
x y z w
GLfloat light_position1[] = {-10.0f, -40.0f, 15.0f, 1.0f };
1.當w為0 是平行光 而xyz值就是此平行光法向量值。
2.若w為1,此光為聚光燈,xyz為燈源位置。
此時,要在一個程式碼:const GLfloat lightDirection[] = {0.0, 0.0, 1.0};
上述藍色程式碼是定義其聚光燈方向向量。
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);// 聚光灯主轴方向 spot direction
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 0.0);
聚光燈需配合此兩行(寫在main中)
=>平行光與聚光燈差別?
=>平行光:在他的法向量中照射到的物體,其光亮程度都是一樣的 沒有隨遠近而變強變弱。
=>聚光燈:就是想像一個電燈在固定位置,所以其光強弱會與距離有關。
Weiting的計圖第十七週
期末專題:
還要加上x, y軸的旋轉才看得)
有打光的格子狀房間

把打光和格子去掉(noStroke())

再打光(lights())就看起來很立體了!

家具的部分用相同原理製作,再加上一點位移(translate())就可以在適當位置
其他貼圖:
壁畫、床單、電視銀幕、地毯等等都是用2D小畫家畫出來的,
再將它們旋轉並移動到適當位置
人物
用一顆打光後的球,並運用鍵盤操控
限制:因為座標系統有旋轉,鍵盤操作上會有點不直觀
老師教導如何用p語言建造3D的家
房間
建構素材:
建構素材:
box
建構方式:
運用2維陣列,陣列的row和column表示x和y軸,裡面的值表示高度(z),再運用三個for迴圈去顯示這些box
還要加上x, y軸的旋轉才看得)
有打光的格子狀房間

把打光和格子去掉(noStroke())

再打光(lights())就看起來很立體了!

家具的部分用相同原理製作,再加上一點位移(translate())就可以在適當位置
其他貼圖:
壁畫、床單、電視銀幕、地毯等等都是用2D小畫家畫出來的,
再將它們旋轉並移動到適當位置
人物
用一顆打光後的球,並運用鍵盤操控
限制:因為座標系統有旋轉,鍵盤操作上會有點不直觀
Hello World_OpenGL_note_Week17
Week 17
本週進度是讓 畫面看起來立體 並對物體進行打光 加上 音訊插入,進行測試
很遺憾我的電腦目前無法使用,不過這個程式應該沒問題(
import ddf.minim.*;
Minim minim;
AudioPlayer player, layer;
void setup(){
size(600,500,P3D);
minim = new Minim(this);
player = minim.loadFile("ost.mp3");
//註: 音樂名稱.副檔名,要把檔案放進資料夾才行
//註: 音樂名稱.副檔名,要把檔案放進資料夾才行
layer = minim.loadFile("K.mp3"); //註: 同上
}
int y = 100;
void draw(){
if(mousePressed){
lights();
}
//lights();
background(0);
translate(width / 2, height / 2);
// Orange point light on the right
pointLight(100, 100, 255, // Color
20, 150, 100); // Position
// Blue directional light from the left
directionalLight(0, 102, 255, // Color
1, 0, 1); // The x-, y-, z-axis direction
// Yellow spotlight from the front
spotLight(255, 150, 109, // Color
mouseX, 40, 20, // Position
0, 0.5, -0.5, // Direction
PI / 2, 2); // Angle, concentration
// Change height of the camera with mouseY
camera(mouseX, mouseY, 220.0, // eyeX, eyeY, eyeZ
-0.0, -5.0, 0.0, // centerX, centerY, centerZ
-10.0, 0.0, 1.0); // upX, upY, upZ
fill(100);
noStroke();
triangle(100,0,-30,20.5,0,120.5);
//sphere(50);
box(90);
stroke(255);
line(-100, 0, 0, 100, 0, 0);
line(0, -100, 0, 0, 100, 0);
line(0, 0, -100, 0, 0, 100);
y = y-1;
if(y < 0 ){
y = height;
}
//建立map函式
//建立map函式
float posx = map(player.position(), 0, player.length(), 0, width);
stroke(0,200,0);
float posy = map(layer.position(), 0, player.length(), 0, width);
line(posx, posy, posx, height);
// note that if the file is MONO, left.get() and right.get() will return the same value
//以下就是用音訊輸入當作控制的神奇畫圖機制
for(int i = 0; i < player.bufferSize() - 1; i++)
{
float x1 = map( i, y, player.bufferSize(), 0, width );
float x2 = map( i+1, y, player.bufferSize(), 0, width );
line( x1, 50 + player.left.get(i), x2, 50 + player.left.get(i+1)*50 );
line( x1, 150 + player.right.get(i)*50, x2, 150 + player.right.get(i+1)*50 );
}
for(int i = 0; i < layer.bufferSize() - 1; i++)
{
float x1 = map( i, y, layer.bufferSize(), 0, height );
float x2 = map( i+1, y, layer.bufferSize(), 0, height );
line( x1, 50 + layer.left.get(i), x2, 50 + layer.left.get(i+1)*50 );
line( x1, 150 + layer.right.get(i)*50, x2, 150 + layer.right.get(i+1)*50 );
}
}
void sound(){
}
void keyPressed(){ //鍵盤按鍵控制音訊播放
if( player.isPlaying() )
{
player.pause();
layer.play();
}
else if ( player.position() == player.length() )
{
player.rewind();
player.play();
layer.pause();
}
else
{
player.play();
layer.pause();
}
}
以上,如有bug,煩請自行改善。
為何要修改別人的程式? 因為他就在那裏。
程式的進步需要大家的幫助!
感謝!
2018年1月12日 星期五
Claire's Note #17
WEEK17
Topic:
- 期末作品Q&A
A. 期末專題
已具備基礎功能及部分附加功能:
主頁面:鍵盤控制旋轉、轉換視角
介面:計時、開新遊戲鍵、暫停鍵、警告視窗
目標:
1. 以滑鼠控制旋轉
2. 讀檔&存檔
3. 目錄
STEP 1: 滑鼠控制
同上週
若未完成,將下方方塊加上貼圖,標示鍵盤控制功能鍵
STEP 2: 讀檔&存檔
將目前魔術方塊每面的顏色及遊戲時間記錄存檔
開啟遊戲時,檢查是否有上次遊戲儲存進度。若有,則以MessageBox確認是否繼續
STEP 3: 目錄
含有開新遊戲、暫停遊戲、讀檔、存檔等功能
詠銓_Week17_Note
Class: 專題製作
1.承上進度:
a.上次以完成了點擊發射球以及將由插入球串中
b.這次一開始先解決消除判定,讓同色且超過3顆相連的球可以消除。
c.同色回吸
d.背景及軌道顯示
e.終點製作
f.debug
2.卡關部分:
a.同色回吸,因為球串的前進方式是讓後面的球推著前面的球跑,所以回吸必須找出尾端的
球。但如果球串是多段的話,不能單純地找鏈結串列的尾端
b.debug:有各種bug,不一一贅述,比較大的是回吸時的插入判斷問題
3.解決問題:
a.將球串的鏈結串列分成順序以及相連的雙向串列,順序可以記錄下一顆球,相連的雙向鏈
結串列只記錄有相連的前後的球,所以要回吸的話只要找到該串球鏈的尾端,再用一開始
的方法,用後面推前面的球就可以往回吸。
b.因為軌道的位置判斷中有用到速度,但回吸時速度是反向,所以造成判斷錯誤,所以將軌
道的位置判斷全部改成用位置來判斷,例如用當時的x座標算出y座標,而不用到速度。
1.承上進度:
a.上次以完成了點擊發射球以及將由插入球串中
b.這次一開始先解決消除判定,讓同色且超過3顆相連的球可以消除。
c.同色回吸
d.背景及軌道顯示
e.終點製作
f.debug
2.卡關部分:
a.同色回吸,因為球串的前進方式是讓後面的球推著前面的球跑,所以回吸必須找出尾端的
球。但如果球串是多段的話,不能單純地找鏈結串列的尾端
b.debug:有各種bug,不一一贅述,比較大的是回吸時的插入判斷問題
3.解決問題:
a.將球串的鏈結串列分成順序以及相連的雙向串列,順序可以記錄下一顆球,相連的雙向鏈
結串列只記錄有相連的前後的球,所以要回吸的話只要找到該串球鏈的尾端,再用一開始
的方法,用後面推前面的球就可以往回吸。
b.因為軌道的位置判斷中有用到速度,但回吸時速度是反向,所以造成判斷錯誤,所以將軌
道的位置判斷全部改成用位置來判斷,例如用當時的x座標算出y座標,而不用到速度。
2018年1月11日 星期四
羅浩倫的學習筆記 Week17
本週沒有上課
專題進度
上週決定在一顆球體上直接貼一張背景圖後,這週開始撰寫程式碼。
基本的概念是是利用老師在week8的時候教的"如何在球體上貼圖(地球)",不過其實是我找不到方法可以讀取舞台的模型,最終成果就是讓MMD模型可以直接在球體中間跳舞,因為如果只是在背景貼一張圖的話,旋轉視角之後就會顯得很突兀,結果圖:
最後的小小心得:有了前幾週花了非常多時間研究如何使用現成的library的經驗,最後在連結opencv的時候就輕鬆了不少,我覺得我這學期最大的收穫應該就是了解了靜態還有動態library的差別吧XD
不過當然在圖學的部分,最近在很多的手遊或是CG、動畫畫面上都有越來越高的比例使用3D模型了,一方面是GPU的進步,另一方面則是人們因應科技進步,眼睛也越來越"貪心"了,在10年以前根本無法想像當今如此複雜多彩的畫面吧,現在還能以人類眼睛都無法跟上的速度變換畫面,這背後極大量的計算量,如果沒有GPU的支援也是很難達成的吧。
最後感謝葉正聖老師這學期的教導,謝謝老師,老師辛苦了~~~~
2018年1月5日 星期五
吳映廷 計算機圖學 week17
本週的主題是製作期末作品。
這週的進度是將基本的HUD(分數,血量)加入
以及敵人的生成.。
以下是分數和血量的部分程式碼。
public void Score()
{
bonusHealthText.SetActive(false);
stick_man_combo += 1;
if (stick_man_combo % 5 == 0)
{
stick_man_health += 10;
bonusHealthText.SetActive(true);
healthText.text = "Health: " + stick_man_health.ToString();
}
comboText.text = "Combo: " + stick_man_combo.ToString();
stick_man_score += stick_man_combo * 10;
scoreText.text = "Score: " + stick_man_score.ToString();
}
public void Hurt()
{
stick_man_combo = 0;
comboText.text = "Combo: " + stick_man_combo.ToString();
stick_man_health -= 10;
healthText.text = "Health: " + stick_man_health.ToString();
if (stick_man_health <= 0)
{
gameoverText.SetActive(true);
gameover = true;
}
}
以下是敵人經過時間隨機生成的程式碼。
if (gameover == false)
{
System.Random rnd = new System.Random();
GenTime = rnd.Next(1, 50);
GenTime2 = rnd.Next(1, 50);
}
if (enemyGenCounter > GenTime)
{
GameObject.Instantiate(enemy);
enemyGenCounter = 0;
}
if (enemyGenCounter > GenTime2)
{
GameObject.Instantiate(enemy_R);
enemyGenCounter2 = 0;
}
2018年1月4日 星期四
訂閱:
文章 (Atom)


