2011-12-11 69 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上的示例非常好 - 所以我建议在有疑问时查看这些示例。通常的经验告诉你何时不使用这些内置的便利课程。但是需要创建一个缺少公共构造函数的对象是一个很好的指标。 –