首先,我使用xna嵌入到WinForms项目中,这是我从microsoft示例页面下载的。现在,关于项目,我想获得所有模型顶点以及所有Model的ModelMesh顶点。我正在考虑使用MeshContent.Geometry
使用自定义内容管道,但问题是我不知道如何在winForms中使用内容管道,我也不知道如何获得儿童几何。所以我尝试使用其他一些带有ModelMeshPart
顶点属性的方法,但这只返回了更多的顶点然后实际存在。例如,一个简单的立方体有8个顶点,但只提供了更多。
编辑:对于顶点,我的意思是他们在Vector3
中的位置。就像用.fbx写的,如果你用记事本打开它。
或者有更简单的方法来获得ModelMesh大小?
提前致谢
答案 0 :(得分:1)
您可以接收具有相同位置的顶点,因为它们具有不同的法线,但是如果您只想知道它的大小并不重要。
从ModelMeshPart vertexbuffer获取大小可以通过以下方式完成:
public void UpdateFrom( ModelMeshPart meshPart ) {
var indices = new short[meshPart.IndexBuffer.IndexCount];
meshPart.IndexBuffer.GetData<short>( indices );
var vertices = new float[meshPart.VertexBuffer.VertexCount
* meshPart.VertexBuffer.VertexDeclaration.VertexStride/4];
meshPart.VertexBuffer.GetData<float>( vertices );
// Usually first three floats are position,
// this way don't need to know what vertex struct is used
for ( int i=meshPart.StartIndex; i<meshPart.StartIndex + meshPart.PrimitiveCount*3; i++ ) {
int index = (meshPart.VertexOffset + indices[i]) *
meshPart.VertexBuffer.VertexDeclaration.VertexStride/4;
position = new Vector3(vertices[index] , vertices[index+1], vertices[index+2]));
UpdateFrom(position);
}
}
public void UpdateFrom(Vector3 point) {
if (point.X > box.Max.X) box.Max.X = point.X;
if (point.X < box.Min.X) box.Min.X = point.X;
....
}
此外,您可以在winforms示例中使用自定义处理器,您只需要在contentbuilder中添加引用...诀窍是引用dll本身......
static string[] pipelineAssemblies =
{
"Microsoft.Xna.Framework.Content.Pipeline.FBXImporter" + xnaVersion,
"Microsoft.Xna.Framework.Content.Pipeline.XImporter" + xnaVersion,
"Microsoft.Xna.Framework.Content.Pipeline.TextureImporter" + xnaVersion,
"Microsoft.Xna.Framework.Content.Pipeline.EffectImporter" + xnaVersion,
Application.StartupPath + "\\SkinnedModelPipeline.dll" ,
Application.StartupPath + "\\AnimationPipeline.dll" ,
....