2011-12-11 68 views
1

我正在爲我們的項目生成地形,這些東西將包含在我可以繪製的Model類中,但是新類將會正常,因爲我可能需要查看特定數據往往,然後我只需要基本的功能與Game類一起工作。 無論如何,我對XNA框架有相當的瞭解,但由於它的複雜性,它可以處理任何事情。所以我的問題是我不能只是一個模型,我不能實例化那個類或任何東西。我有我相信用於形成模型幾何的正確數據,這是我現在需要的,並且稍後可能會使其具有紋理。 我不知道該從哪裏出發。如何從零開始創建模型

XNA你通常使用Content.Load,讓他們的內容管道讀入文件並專門解析它,但是我想避免這種情況,因爲我想要生成我的地形。我可以計算我希望組成網格的三角形的頂點數據和索引數組,但到目前爲止,我的努力嘗試實例化任何對象,如模型或其包含的對象,都失敗了。 如果有一些工廠類可以用來構建它,我不知道那是什麼,所以如果別人可以指出我在那裏的正確方向,並給我一個關於如何構建模型的粗略概述,那將有助於。 如果這不是答案,也許我需要做一些完全不同的事情,或者以使用Content.Load爲中心,但基本上我不希望我的地形坐在文件中,執行之間一致,我想控制網格加載數據並將其隨機化等等。

那麼我怎樣才能得到一個完全以編程方式生成的模型,以便在屏幕上顯示出來,並且仍然暴露出其數據?

回答

4

Model及其相關類別(例如:ModelMesh)是便利等級。它們不是繪製模型的唯一方法。預計有時候,特別是在做一些「特殊」事情時,你將不得不完全重新實現它們,使用與Model相同的低級方法。

下面是你應該做的快速版本:

首先,在加載時,創建VertexBufferIndexBuffer並使用每個SetData填寫每個相應的數據。

然後,在繪圖時,這樣做:

GraphicsDevice.SetVertexBuffer(myVertexBuffer); 
GraphicsDevice.Indices = myIndexBuffer; 

// Set up your effect. Use a BasicEffect here, if you don't have something else. 
myEffect.CurrentTechnique.Passes[0].Apply(); 

GraphicsDevice.Textures[0] = myTexture; // From Content.Load<Texture2D>("...") 

GraphicsDevice.DrawIndexedPrimitives(...); 
+0

是的,一個解決方案,可以使用低級別的命令,我不知道是什麼在我手上,因爲我無法查看源代碼的任何東西。這留下了你提到的便利對象,我想更多地瞭解他們爲什麼在那裏,這將有助於確定我何時應該使用它們以及不應該使用它們。所有的MSDN都有一個非常缺乏Javadoc的方法等,與Java教程中心不同,它更有幫助。 現在我可以通過使用最後一條命令來獲得嗎?我還想繪製其他通常加載的模型,我想管理gfx設備緩衝區很困難。 – Pysis

+0

不要混淆低級和困難。實際上這很容易 - 只需在設備上設置你想要的,然後調用一個'Draw *'方法即可。 XNA的MSDN文檔有點欠缺。但是示例和App Hub上的示例非常好 - 所以我建議在有疑問時查看這些示例。通常的經驗告訴你何時不使用這些內置的便利課程。但是需要創建一個缺少公共構造函數的對象是一個很好的指標。 –