• 沒有找到結果。

L & L 3D Baseball Game

N/A
N/A
Protected

Academic year: 2022

Share "L & L 3D Baseball Game"

Copied!
13
0
0

加載中.... (立即查看全文)

全文

(1)

國立台灣大學資訊工程學系學生期末報告 日期:2010 年 1 月 18 日

課程:Interactive Computer Graphics 2009 Fall 授課教授:歐陽明教授

L & L 3D Baseball Game

姓名:盧子珣、李明璋

級別:大學部 資工系三年級

學號:B96902046、B96902107

(2)

一、簡介(Introduction):

一款擬真的棒球遊戲,需要運用到相當高深的 CG 技術,才能將人物的動畫唯妙唯 肖地表現出來。除了要求逼真外,更要兼顧遊戲操控的方便性,以及遊戲內容的耐玩度,

才能作出一款受歡迎的棒球遊戲。

今年是我們第一次接觸計算機圖形,也是剛開始學習 OpenGL,但是從前幾次的作 業,加上平常接觸動畫電影與 3D 遊戲的經驗,都使我們對 CG 越來越喜愛,希望有一 天能夠親手做出有如真人般的動畫、電影或遊戲。

利用這次 Final Project 的機會,我們希望能以 3D 遊戲為主題,運用 CG 課堂中所 學習到的知識,實做出一款虛擬 3D 棒球遊戲。因為要模擬一場棒球比賽,所要考慮的 細節太多,舉凡跑壘、守備、投球、與電腦 AI 等,都不是短時間能可能實作出來的,

所以我們在這次的 demo 中,只先實作出棒球最基本的打擊部份,並藉由全壘打大賽的 形式,賦予遊戲一些特殊的規則,以增加遊戲的獨特性與趣味性。

主要遊戲畫面↑

主選單↓ 結束選單↓

二、實作(Implementation)

(3)

二、實作(Implementation)

(一) 動畫

1. 選定 model

我們在程式中所使用的人物 model,是使用 MD2 model。.md2 檔的優點是讀 取時間快速,雖然它的資料庫較為龐大,而且同一組動作不能套用到其他 model 身上,必須針對不同 model 畫出動畫,但是因為它的 header 檔與 data 檔存取方式 相當整齊,有利於繪製較複雜的動作,所以我們最後決定採用 MD2 model。

2. MD2 介紹

MD2 的存放資料的方式為,在一開始的部份存放 header data,當中所存取的 資料,可以方便我們讀取 header 下面動畫的座標資料。以下是.md2 header 的 structure 與其中各項變數的說明。

struct Md2Header_t{

int ident; // Magic number, 用來辨認檔案的類型,必須為"IDP2"

int version; // Md2 format version, 必須為”8”

int skinwidth; // Texture 的寬度(width) int skinheight; // Texture 的高度(height) int framesize; // Size of one frame in bytes

int num_skins; // Number of skins (可以套用到該 model 上的 texture 數目) int num_vertices; // Number of vertices (每個 frame 的 vertices 的總和) int num_st; // Number of texture coordinates (texture 的座標數目) int num_tris; // Number of triangles

int num_glcmds; // Number of OpenGL commands int num_frames; // Number of frames (動畫的數量)

int offset_skins; // offset to skin data

int offset_st; // offset to texture coordinates int offset_tris; // offset to triangle data int offset_frames; // offset to frame data

int offset_glcmds; // offset to OpenGL commands int offset_end; // offset to the end of the file };

(4)

下圖為 MD2 檔案針對各個動畫的存取流程,各個 Animation 其實就是一堆 frames 的集合,而各個 frame 又是由一群 vertexes 結合而成。

3. 在 OpenGL 中播放動畫

要在 OpenGL 中播放動畫,首先要撰寫一個 loader 檔來讀取.md2 檔中所記錄 的各項資料與點座標,然後才能開始處理 model。我們在網路上找到了不少 loader 檔的範例,對於學習如何製作或修改一個 MD2 loader 相當有幫助。

雖然在製作.md2 model 檔時,能夠將不同動畫命名成各自的名稱,但是 loader 檔寫法一般會寫成一直重複播放同一動畫,因為 OpenGL 會一直在 glutMainLoop () 中執行。為了達到呼叫一個動畫只讓它播放一次的目的,必須製作特殊的 loader 檔,讓一種動畫播放完一次後,會停在該動畫第一個 frame 的位置靜止,值到下次 再呼叫該動畫。

以下是 loader 檔中播放動畫的部份 code 與說明,其中_currFrame 是紀錄目前 要播放的 frame,他的範圍必須在 startFrame 和 endFrame,才能確保是播放所選定 的動畫。

void Md2Object::animate (int startFrame, int endFrame, float percent) {

if (_currFrame < startFrame) //確保_currFrame 介於 startFrame 與 endFrame 之間 _currFrame = startFrame;

if (_currFrame > endFrame) _currFrame = startFrame;

以下 code 是接續上面的 code,主要是用來讀取下一個 frame,這樣做的目的 是為了避免下一個 frame 讀取到別個動畫的 frame,如果等到播放到該 frame 才判 斷會影響到動畫流暢度,所以在播放目前 frame 時就先判斷下一個 frame,以便提

(5)

早因應下一個 frame 超出範圍的情況。這裡因為一個動畫只要播放一次,所以再判 斷到下一個 frame 是 endframe+1 時,就讓他回到 startframe,並持續停在 startframe 直到下次要再撥放此動畫為止。

if (_interp >= 1.0) {

_interp = 0.0f;

if(oo==0) _currFrame++; //若為撥放第一次則正常播放 if (_currFrame >= endFrame && oo==0) //oo==0 代表播放第一次

_currFrame = startFrame;

if(oo==0) _nextFrame = _currFrame+1;

if (_nextFrame >= endFrame){

_nextFrame = startFrame; //撥放完一次後,就停在 startFrame if(oo==1) endFrame = startFrame; //所以將 endFrame 設為 startFrame _currFrame = startFrame;

oo=1; //紀錄是否已經撥放完一次了 }

} }

4. 編輯 MD2 model

上圖是利用 MilkShape 來進行 MD2 檔的編輯,可以看出模型有支援骨架,以及 vertex 的設定,以及 texture mapping。

(6)

(二) 場景繪製

由於 MD2 有其三角多邊形數的限制,因此我們在繪製場景物件時是利用 OBJ 格式來進行繪畫,OBJ 的格式類似.tri 檔,有給明確的座標值,另外他有支援 texture 的對應,所以經由 OBJ Loader 可以做出精美的模型,在這邊我們是直接把 Bmp 讀 近來,然後在 baseballOBJ.h 檔案內進行 Load 的動作。遠景方面,我們是直接利用 大型 texture 製造出遠方的感覺。草皮也是用簡單的 Quad 加上 texture 來展現,在 這裡我們可以馬上了解到 texture 的好處,即使是一個平平的表面,再加了一個磚 塊的 texture,表面馬上就有凹凸不平的效果,這種可以在很低的多邊形之下,表 現出立體的方式,常常在許多遊戲中出現,是種可以節省資源的方式。

(7)

(三) 擊球

球棒擊球的不分有幾個要點,分別是判斷揮棒時機是否正確,也就是球棒是否 擊中球,以及如何判定用何種力道擊中球,也就是球的飛行距離判斷。

1. 判斷出棒時機

我們採用的方法是,按下揮棒的動畫後,就給定一個棒子的座標範圍,使該處 範圍能剛好涵蓋一整支球棒,並且取得當時球的座標位置,然後判斷兩者的接觸情 形,如果有接觸就立刻算出球的飛行仰角與飛行方向,讓球能產生拋物線飛行的效 果。

2. 判定所施放的力量

至於如何決定擊中球的力道,主要是藉由球棒與球的相對位置,利用物理學上 正常打擊時所能施力的情形來判定,例如,球在內角而球棒在球員的前方擊中球,

因為較容易施放力量,所以會給予較大的飛行距離;反之,如果球在內角,但是球 棒延遲出棒,則因為力量會被球擠壓,無法正常施力,因此會壓縮到球的飛行距離。

以下是判斷球在何處被擊到,其中 kkk 該項變數用來表示球中心的 z 座標。

If ( kkk >= 61 && kkk <= 66 ) {

Mousefree = 0;

PullHit ();

} //表示球在本壘偏前方被擊中,球理論上應當打到左邊 else if ( kkk >= 67 && kkk <= 72 ) {

mousefree = 0;

PushHit ();

} //表示球在本壘偏後方被擊中,球理論上應當打到右邊

(8)

(四) 人機互動

Motion Controller 是當前遊戲很熱門的一種操縱方法,像 Wii 一樣。利用更直 覺的方法來進行遊戲。由於我們只是普通的大學生,不太可能拿到太好的偵測裝 置,Wii 的搖桿也稍嫌昂貴,所以我們只能利用現成的 Webcam 來取代。

改裝普通 WebCam 成為可以增測 IR 紅外線,挖掉焦距鏡頭裡面的濾光片後,

再加一張存 3.5 吋磁碟片的格光紙取代。如此一來可以除去自然光的雜訊,並順利 的得到紅外線的資訊。

因此我們遊戲除了用鍵盤操作外,還可以使用上圖的方式,利用 webcam 來偵 測我們的 LED 手電筒,經過右方程式的分析後,將 output 傳給我們的 Game,來 做出擊球的指令。若光線、位置調整的適宜,可近乎在 real time 做出擊球反應。

(9)

(五) 遊戲攝影機角度

藉由 OpenGL 中 camera 視角的轉換,修改一些座標和旋轉角度的變數值,可 以讓攝影機自由移動,以下是用到的函式,

glTranslated (-eye.x, -eye.y, -eye.z);

glRotated (rot.x, 1.0f, 0.0f, 0.0f);

glRotated (rot.y, 0.0f, 1.0f, 0.0f);

glRotated (rot.z, 0.0f, 0.0f, 1.0f);

藉由這四個函式,就可以在球被擊出後,讓攝影機立即移動以捕捉球的位置,讓打 擊者能近距離觀察到球的落點。如果的飛行高度太高的話,攝影機也會適當的調整 拍攝角度,使球能夠一直處於畫面當中,如下圖,球被及往高空,攝影機正向上捕 捉球的位置。

(10)

(六) 其他設定

1. GUI 選單

在 3D 空間的遊戲中,要做出 2D 的 GUI 是比單純做 2D 遊戲還要難的,

因為兩種屬性是不同的,因此我們的做法是,在選單這裡其實 3D 部分都是已 經繪好,但是在放 menu 的圖片整個蓋過去,然後在 menu mode 時把遊戲的參 數先都鎖住,一旦進入遊戲,就把 menu 圖片刪去,把遊戲按鍵解開。另外 menu 選單部分,control 介紹頁面、credit 工作夥伴介紹以及最後分數的顯示,

也是利用三張不同的 2D 圖來做切換,來達到 2D 選單的效果。

2. 遊戲規則

每名玩家有十顆球的擊球機會,每次如果順利將球擊到界內,就會得到球 的飛行距離,球的飛行距離累積總和,即為該次遊戲得分。除此之外,如果能 夠將球擊成全壘打,則會得到該次飛行距離乘以 2 的獎勵。

三、使用的工具(Tool)

以下是用來撰寫主程式:

Dev-C++

OpenGL

Visual Studio 2008

以下是用來編輯 MD2 model:

3D Studio Max 2008 MilkShape 3D 1.8.4

以下是用來處理 texture 圖檔與 2D 貼圖:

Photo Impact

Real World Icon Editor

以下是用來實現 HCI(人機互動介面) C# Visual Studio 2008

(11)

四、未來展望(Future Work)

未來希望能優先改進的部份是動畫的細膩度,因為是單純使用軟體來繪製人物 的 model,沒有真人動作的模型當作參考,所以可能會和實際動作有一點差別,希 望將來能藉由更好的模型製作技術,配合真人動畫,創造出更逼真的遊戲人物。

至於要製作有如身歷其境的遊戲,音效是相當重要的一環,如果將來能在遊戲 中添加更多真實的音效,應該能提昇遊戲耐玩度。

遊戲內容方面,這次的遊戲因為受限於製作的時間有限,只能將棒球運動中的 打擊部份展現出來,將來可以逐漸發展成為投打模式、兩隊輪流進行投打比賽、添 加守備球員等內容,讓遊戲漸趨完整,成為一款棒球迷不能錯過的好遊戲。

人機互動上,如何調整攝影機的 fps 和適當的靈敏度,以求遊戲與玩家達到 real time 的互動,這對於一款人機互動的運動遊戲來說,是非常重要的課題。

另外也希望在上完大三必修計算機網路之後,可以將此遊戲加入線上排行榜的 功能,讓許多人共同來競爭,增加遊戲的重複遊玩性。未來增加投手的角色後,也 可以藉由網路連線,讓兩名玩家進行投打對決,讓遊戲變得更有特色。

(12)

五、遊戲畫面(PrintScreen)

以下是一些遊戲畫面的截圖,可以從中約略看出遊戲的外觀架構。

(13)

六、參考資料(Reference)

1. The Quake II's MD2 file format David Henry 2002/12/21 2. The Baseball Bat Collision

http://www.docstoc.com/docs/622036/

3. OpenGL

http://www.opengl.org/

4. MilkShape Tutorial

http://homepage.eircom.net/~abyrne/Models/

5. Laser Gesture Recognition

http://www.codeproject.com/KB/directx/lasergesture.aspx

參考文獻

相關文件

由上述引理 I 和它的推廣及其應用, 我們自然會聯想到對數函數是否也有類似的結果呢. 無獨有偶, 我們先看下面的引理

在高中的基礎數學教材中, 有許多主要單元, 都是以相似三角形邊長成比例的性質, 為理 論的根源。 例如: 三角函數的定義、 求直線方程式以及內插法等。 筆者在高中服務了一些時日,

對於給定的一個 x 值,經過某一對應方式後得到「唯一」的 y 值,這種對應方式我們稱 為函數,其中 x 是自變數,y 是應變數。. 而在表

因新版 IE 不支援 flash,所以無法播放過去上傳的影音檔,自 1042 起錄製的格式都統一改為 mp4,但 1042 前所錄製的檔案因 格式無法修改,目前只能用舊版的 IE

print –dtiff my_image.tif: 將目前指定的圖形,產生 TIFF 格式的影像檔,並以my_image.tif 的檔名儲存。.

另外它是由 column 來描繪矩陣的乘法, 在證明或 推導有關矩陣乘法性質時, 有時比式子 (2.13) 利用 entry 來看方便多了..

„ Windows Media Player 也可以藉由擴充 codec 的方式來播放DivX格式的AVI檔、或是 MPEG-4格式的WMV檔.

Not 有否定和相反的意思, 給定一個 statement P, 我們用 ¬P, 來表示 not P, 一般稱為..