2010-05-29 77 views
2

在遊戲中存儲3D模型的最佳方法是什麼? 我在矢量中存儲: 矢量三角形(每個三角形包含texcords的數量,頂點的數量和法線的數量), 矢量點; vector normals; 矢量texCords;在遊戲中存儲3D模型,最好的方法

+3

「在遊戲中存儲3D模型?」:您正在談論的是:內存存儲(正在使用時)還是磁盤存儲(遊戲安裝後)? – SigTerm 2010-05-29 01:07:25

+1

最好的方法完全取決於你的遊戲。如果你目前的格式適用於你的遊戲,那就去做吧。如果你在談論文件格式,那麼你可以使用一些標準格式,比如這裏提到的一些標準格式(http://stackoverflow.com/questions/585769/recommended-3d-model-type-遊戲人物角色模型加載手動)和[這裏](http://stackoverflow.com/questions/1488579/3d-model-format-for-games)。 – 2010-05-29 01:08:01

回答

3

在這種情況下,我不確定什麼構成「最好的方法」,因爲這將取決於情況,在您的問題中,它有些開放性的解釋。

如果您正在討論如何快速呈現靜態對象,您可以使用Display Lists進行很長的路要走。它們可以用於所有OpenGL調用一次,然後回想那些指令以在遊戲中使用時呈現對象。所有用於計算頂點位置,法線等的開銷只會在構建每個顯示列表時執行一次。缺點是如果你的模型經常變化,你不會看到太多的性能增益。

編輯:SurvivalMachine下面提到顯示列表已被棄用。特別是,它們在OpenGL 3.0版中被棄用,並且完全從版本3.1中的標準中移除。經過一些研究,似乎Vertex Buffer Object(VBO)擴展是首選的替代方案,儘管我發現許多來源聲稱性能不如顯示列表。

+2

顯示列表已被棄用。 – SurvivalMachine 2010-05-29 13:45:44

+0

@SurvivalMachine:我不知道。自從我做了任何grpahics編程已經有一段時間了。感謝您的提醒;我已經更新了我的答案。 – andand 2010-05-29 20:09:10

+0

在我看來,與顯示列表相比,VBO的性能取決於視頻卡。我也做了一些搜索,幾次討論已經過去了幾年,並且指出當時的「新」卡開始看到維也納國際組織的表現比DL更高。無論如何,顯示列表的棄用是(IMO)遠離它們的充分理由,更不用說在DirectX中沒有相同的顯示列表,所以如果您想要抽象引擎以允許DirectX支持您將不得不轉移到頂點數組或維也納組織。 – Ricket 2010-05-30 00:14:22

0

我選擇從.ms3d格式導入模型,雖然稍後可能會重構,但我認爲它爲我的3D模型的數據結構提供了一個體面的基礎。

spec(C頭格式)是一個非常簡單的讀取;我用Java編寫我的遊戲,所以我簡單地移植了每個數據結構:頂點,三角形,組,材質以及可選的骨架動畫元素。

但是真的,模型只是頂點(或三角形)的三元組,每個頂點都有一個材質,對吧?首先創建這些基本結構,編寫一個繪製函數,爲參數提取一個模型並繪製它,然後添加您需要的任何其他功能。迭代設計,如果你願意的話。

+0

現在我將我的三角形存儲在std :: vector上,但它工作得很慢:/ 我必須存儲在std :: vector上,beacouse我檢查與它們的碰撞,有沒有更好的方法然後向量? – piotrek 2010-05-30 12:31:52

+0

我會使用一個常規數組。std :: vector會有開銷,因爲它意味着要容納經常改變的數據結構;但由於您只需加載一次數據,並且您應該能夠知道(或弄清楚)需要存儲多少個三角形,因此不需要矢量的額外功能。如果你真的想要,你可以加載到矢量中,然後在加載後將其複製到數組中。無論如何,循環訪問數組可能會爲您提供所需的額外速度。 – Ricket 2010-05-30 16:01:04

+0

還要確保你正在進行更有效的碰撞,而不是僅僅檢查每幀所有三角形的碰撞。你應該做更高層次的事情,比如邊界框檢查,甚至是大場景中的四叉樹/八叉樹,只有那些測試是真實的,那麼你應該深入到只有碰撞網格的三角形。 – Ricket 2010-05-30 16:15:47