2013-08-03 1 views
0

나는 fbx 파일에서 버텍스 위치 데이터를 얻으려고합니다. 테스트하기 위해 간단한 평면을 사용하고 xz 평면에 놓여 있으며 4 개의 꼭지점이 있습니다 (+/-1, 0, +/- 1). 정점 데이터는 평면을 내보내는 데 사용되는 Maya에서 확인됩니다.XNA에서 FBX의 버텍스 정보, 이상한 결과

가 여기 내 정점 추출 코드입니다 : 네 꼭지점이 있기 때문에

void getVertices() 
{ 
    foreach (ModelMesh mesh in model.Meshes) 
     foreach (ModelMeshPart part in mesh.MeshParts) 
     { 
      nVerts = part.NumVertices; 
      Vector3[] vec = new Vector3[nVerts * 2]; 

      part.VertexBuffer.GetData<Vector3>(vec); 

      Console.WriteLine("#Vertices in Model: " + nVerts); 
      for (int i = 0; i < vec.Length; i++) 
      { 
       Console.WriteLine(i + " " vec[i].ToString()); 
      } 
     } 
    } 

, 나는 각 정점의 위치와 정상적인 각 정점 일 8 Vector3s, 1을 얻는다. 비행기의 경우 MOST가 정확합니다 (처음에는 좀 더 복잡한 모델을 사용했고 덜 정확했습니다). 여기

결과이다 : 모든 법선 Y.에 똑바로 가리켜 야

포인트 : (1,0, -1) (1,0,1) (1,0,1) (-1,0,1)

법선 (0,1,0) (0,1,0) (1, -1,0) (0,0,0)

세 번째 점 (두 번째와 동일)과 마지막 두 법선이 잘못되었습니다. 왜 내가 올바른 데이터를 얻지 못하고 있는지 알 수 없습니다. vector3 배열을 늘리려고했는데 보낼 벡터가 8 개 뿐이므로 어떤 정보도 놓치지 않는다고 생각합니다.

답변

1

콘텐츠 파이프 라인을 통해 FBX를로드했다고 가정하면 프레임 워크 표준 버텍스 유형 중 하나가 할당됩니다. 그러나 위치 정보와 일반 정보 만 갖는 버텍스 유형은 없습니다. 대부분의 경우 결과가 엉망이되는 세 번째 요소가있을 수 있습니다.

int vertexStride = model.Meshes[0].MeshParts[0].VertexDeclaration.VertexStride; 
VertexBuffer vb = model.Meshes[0].MeshParts[0].VertexBuffer; 
List<Vector3> vertexPositions = new List<Vector3>(); 


for(int i = 0; i < vb.VertexCount; i++) 
{ 
    Vector3 vec; 
    vb.GetData<Vector3>(i*vertexStride, vec, i, 1, vertexStride);//3rd param should either be i or 0 
    vertexPositions.Add(vec); 
} 
+0

, 고마워요! 인덱스를 찾았습니다. 버퍼가 모든 프로그램에서 변경되었습니다. 동일한 프로그램에서 가져온 것이기는하지만 생각지 못했지만 몇 가지 작은 구문 오류가있었습니다. 그래서 내가 완성 된 것을 게시 할 것입니다. 다음 녀석. 다시 한번 감사드립니다. – user1693188

0

모델이 다른 정점 구조를 가질 수 있도록 최선의 당신이 또는 가장이 존재하는지 확인 오른쪽 VertexElementUsage를 사용하는 일반 어떤 텍스처를 wnat 경우, 데이터를 읽을의 정보를 고려할 수 있습니다 :이 작업을해야합니다 데이터가있는 오프셋입니다.

var vertices = new float[ meshPart.VertexBuffer.VertexCount 
         * meshPart.VertexBuffer.VertexDeclaration.VertexStride/4]; 

meshPart.VertexBuffer.GetData<float>(vertices); 

var vertexElements = meshPart.VertexBuffer.VertexDeclaration.GetVertexElements(); 

int vertexOffset = vertexElements 
     .First(e => e.VertexElementUsage == VertexElementUsage.Position) 
     .Offset/4; 

for (int i = meshPart.VertexOffset; 
     i < meshPart.VertexOffset + meshPart.NumVertices; i++ { 
    int baseIndex = i * (meshPart.VertexBuffer.VertexDeclaration.VertexStride/4); 

    var X = vertices[baseIndex + vertexOffset] ; 
    var Y = vertices[baseIndex + vertexOffset + 1]; 
    var Z = vertices[baseIndex + vertexOffset + 2]; 
} 
0

인덱스 데이터를 포함 내 최종 스티브 H로부터받은 도움에 따라 대답, 그리고 :이 일을

VertexBuffer vertexBuffer; 
    VertexPositionColor[] verts; 
    IndexBuffer indexBuffer; 
    short[] indices; 
    int nVerts; 

    void getVertices() 
     { 
      int vertexStride = model.Meshes[0].MeshParts[0].VertexBuffer.VertexDeclaration.VertexStride; 
      vertexBuffer = model.Meshes[0].MeshParts[0].VertexBuffer; 
      nVerts = vertexBuffer.VertexCount; 

      indexBuffer = model.Meshes[0].MeshParts[0].IndexBuffer; 
      int nInts = indexBuffer.IndexCount; 

      indices = new short[nInts]; 

      indexBuffer.GetData<short>(indices); 

      verts = new VertexPositionColor[vertexBuffer.VertexCount]; 

      for (int i = 0; i < vertexBuffer.VertexCount; i++) 
      { 
       Vector3[] vertData = new Vector3[vertexBuffer.VertexCount]; 
       vertexBuffer.GetData<Vector3>(i * vertexStride, vertData, i, 1, vertexStride); 

       verts[i].Position = vertData[i]; 
      } 

      vertexBuffer = new VertexBuffer(device, typeof(VertexPositionColor), nVerts, BufferUsage.WriteOnly); 
      indexBuffer = new IndexBuffer(device, typeof(short), nVerts/4 * 6, BufferUsage.WriteOnly); 

      vertexBuffer.SetData(verts); 
      indexBuffer.SetData(indices); 

     } 
+0

다른 데이터에 액세스하려는 경우 데이터를 Vector3으로 가져 오는 것은 좋지 않습니다. TextureCoordinates는 vector2, Colors는 Vector4 ... 필요에 따라 해결되지만 ... 데이터를 float로 검색하고 VertexElementUsage를 사용하는 것이 좋습니다. 원하는 데이터의 오른쪽 오프셋 위치를 감지하려면 ... – Blau

+0

네, 감사합니다. 내 자신의 작업이 끝날 때까지 대답을 보지 못했습니다. 3D 모델이 입자 시스템에서 잘 작동하면 일단 돌아가서 구현할 것입니다. – user1693188