0

まず、マイクロソフトのサンプル ページからダウンロードした WinForms プロジェクトに埋め込まれた xna を使用しています。さて、プロジェクトについてですが、モデルのすべての頂点と、モデルの ModelMesh の頂点もすべて取得したいと考えています。でカスタム コンテンツ パイプラインを使用することを考えて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 に答える