2013-05-01 2 views
1

C# 및 XNA 4.0을 사용하여 FBX 모델의 정점을 반복적으로 시도하고 있습니다. 저는 정점에 접근 할 수 있다면면 법선, 모서리, PolygonVertexIndex 등의 다른 부분에 직접 액세스 할 수 있다고 생각합니다. XNA 4.0을 사용하여 fbx 모델에서 정점 추출

나는 XNA 3.0, Extracting Vertices and Triangles from an XNA Model 하지만 그는 4.0에 존재하지 않는 것 사용되는 3.0 구조를 사용하여이 작업을 수행하는 방법을 논의 존 Watte의 글을 발견했다. 특히

, 그는 다음과 같이 정점에 액세스 :

Vector3[] a = new Vector3[myModelMeshPart.NumVertices]; 
myModelMesh.VertexBuffer.GetData<Vector3>(myModelMeshPart.StreamOffset + myModelMeshPart.BaseVertex * myModelMeshPart.VertexStride, 
      a, 0, myModelMeshPart.NumVertices, myModelMeshPart.VertexStride); 

하지만 XNA 4

, VertexBufferMeshModel의 속성 될 것 같지 않습니다.

아무도 Model의 정점 기본 반복을 안내해 줄 수 있습니까?

감사합니다.

@ user2340610 답장을 보내 주셔서 감사합니다.
내 사용 시도가 실제 verts보다 적습니다.
VertexBuffer를 어떻게 사용하는지 모르겠습니다. 이 코드에 대해 말씀해 주시겠습니까?

private void getVerts(Model mdl) 
{ 
    foreach (ModelMesh mm in mdl.Meshes) 
    { 
     foreach (ModelMeshPart mp in mm.MeshParts) 
     { 
      VertexBuffer vb = mp.VertexBuffer; 
      short[] s = new short[mp.PrimitiveCount * 3]; 
      IndexBuffer ib = mp.IndexBuffer; 
      ib.GetData<short>(mp.StartIndex * 2, s, 0, mp.PrimitiveCount * 3); 

      Vector3[] v = new Vector3[4]; 
      VertexPositionNormalTexture[] vert = new VertexPositionNormalTexture[4]; 
      mp.VertexBuffer.GetData<VertexPositionNormalTexture>(vert, 0, mp.NumVertices); 
      for (int i = 0; i < v.Length; i++) 
      { 
       v[i] = vert[i].Position; 
       trace("(" + v[i].X.ToString() + ", " + v[i].Y.ToString() + ", " + v[i].Z.ToString() + ")"); 
      } 
     } 
    } 
} 

verts를 반복하는 샘플이 있습니까?

답변

0
modModel = Content.Load<Model>("Cube1"); 
foreach (ModelMesh modmModel in modModel.Meshes) 
{ 
    foreach (ModelMeshPart mmpModel in modmModel.MeshParts) 
    { 
     modelExtractor = new ModelExtractor(mmpModel, new Vector3[mmpModel.NumVertices * 2], new VertexPositionColor[mmpModel.NumVertices]); 
     modelExtractor.ExtractVertices(); 
    } 
} 
for (int a = 0; a < modelExtractor.ArrVectors.Length; a++) 
{ 
    Console.WriteLine(modelExtractor.ArrVectors[a]); 
} 
vertexBuffer = new VertexBuffer(GraphicsDevice, typeof(VertexPositionColor), modelExtractor.VpcVertices.Length, BufferUsage.None); 
vertexBuffer.SetData(modelExtractor.VpcVertices); 

이것은 주류에서 온 것입니다. 이것이 모델을 ModelMeshPart로 변환하는 방법입니다. 나는 .fbx에서 데이터를 추출 할 때까지 버텍스 버퍼를 만들지 않았다. for 루프 (및 그 내부의 코드 행)는 추출한 정점 데이터를 콘솔 창에 기록하여 목록을 제공합니다.

private ModelMeshPart mmpModel; 
private Vector3[] arrVectors; 
private VertexPositionColor[] vpcVertices; 

다음은 내 ModelExtractor 클래스의 필드입니다. 다음 방법으로 사용됩니다.

public void ExtractVertices() 
{ 
    this.mmpModel.VertexBuffer.GetData<Vector3>(this.arrVectors); 
    for (int a = 0; a < vpcVertices.Length; a += 2) 
    { 
     this.vpcVertices[a].Position.X = arrVectors[a].X; 
     this.vpcVertices[a].Position.Y = arrVectors[a].Y; 
     this.vpcVertices[a].Position.Z = arrVectors[a].Z; 
    } 
} 

"Vector3"유형의 데이터를 추출했습니다. .fbx의 모든 정점에는 위치를 나타내는 Vector3과 법선을위한 Vector3이 있습니다. 그런 다음에야 위치 구성 요소를 Vector3 배열에서 VertexPositionColors 배열로 이동합니다. for 루프는 "a"를 1 대신 2 씩 증가시킵니다. 이것은 법선에 대한 Vector3을 건너 뛸 수 있도록하기위한 것입니다. 내가 그 VertexBuffer에를 사용하여 도움이 필요

public static void ModelData(Model model) 
{ 
    ModelMeshPart part = model.Meshes[0].MeshParts[0]; 

    VertexPositionNormalTexture[] vertices = new VertexPositionNormalTexture[part.VertexBuffer.VertexCount]; 
    part.VertexBuffer.GetData<VertexPositionNormalTexture>(vertices); 

    ushort[] drawOrder = new ushort[part.IndexBuffer.IndexCount]; 
    part.IndexBuffer.GetData<ushort>(drawOrder); 

} 
+0

고마워,이게 내가 정점을 갖도록 해줄거야.너무 나쁜 다른 데이터에 대한 해당 버퍼가 없습니다. – user2340426

+0

법선 벡터에 대한 버퍼가 필요하다. 버퍼는 실제로 드로잉 용입니다. – user2340634

2

"모델"에는 "VertexBuffer"가 없습니다. "ModelMesh"에는 "VertexBuffer"가 없습니다. 그러나 "ModelMeshPart"에는 실제로 "VertexBuffer"가 있음을 알게되었습니다. 나는 .fbx에서 처음으로 데이터 추출을하고있다. 프로젝트에 포함시킬 모델은 ModelMeshPart에 저장해야합니다. 그렇게 나쁘지는 않습니다. .fbx의 전체 메쉬는 한 부분으로 간주 될 수 있습니다.

+0

(모델이 몇 당신은 물론 그들을 통해 루프가 부품이있는 경우) – user2340426

+0

내 새로운 대답을 참조하십시오. – user2340634

0

내 솔루션입니다. 함께 패치 한 코드 샘플은 fbx 파일에서 볼 수있는 정점을 제공하지 않습니다. VertexBuffer를 사용하는 것이 나의 기술 부족이라고 생각합니다. 당신이 보여줄 수있는 기본적인 반복 예제가 있습니까?
관련 문제