0

首先,我使用嵌入到 WinForms 项目中的 xna,该项目是我从微软示例页面下载的。现在,关于项目,我想获取所有模型顶点以及模型的所有模型网格顶点。我正在考虑使用自定义内容管道,MeshContent.Geometry但问题是我不知道如何在 winForms 中使用内容管道,也不知道如何获取儿童几何图形。所以我尝试使用其他一些具有ModelMeshPart顶点属性的方法,但这只会返回比实际更多的顶点。例如,一个简单的立方体有 8 个顶点,但这只会提供更多。

编辑:对于顶点,我的意思是它们在Vector3. 如果你用记事本打开它,就像它用 .fbx 写的一样。或者有没有更简单的方法来获取 ModelMesh 大小?

提前致谢

4

1 回答 1

1

您可以接收具有相同位置的顶点,因为它们具有不同的法线,但如果您只想知道大小,则无关紧要。

从 ModelMeshPart 顶点缓冲区获取大小可以通过以下方式完成:

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" ,
        ....
于 2012-11-14T23:33:29.973 回答