2015-07-07 3 views
0

Я пытаюсь вырезать загруженную трехмерную модель пополам, используя MonoGame (что очень похоже на XNA). Мне не нужно делать это в режиме реального времени, поэтому производительность не является большой проблемой.Резка модели XNA пополам удалением вершин и индексов

Я получаю свои вершины и индексы, используя ModelMeshPart как таковой.

Vector3[] vertices = new Vector3[part.NumVertices]; 
part.VertexBuffer.GetData<Vector3>(vertices); 

short[] indices = new short[part.PrimitiveCount * 3]; 
part.IndexBuffer.GetData<short>(indices); 

, а затем установить их с помощью

part.IndexBuffer.SetData<Vector3>(vertices); 
part.VertexBuffer.SetData<short>(indices);  

До этого, хотя я беру эти массивы и попытаться очистить все вершины (и индексы, относящиеся к ним), которые расположены позади центр Z места модели как таковой.

float centerZ = modelMesh.BoundingSphere.Center.Z; 

for (int i = 0; i < indices.Length; i += 3) 
{ 
    short index0 = indices[i]; 
    short index1 = indices[i + 1]; 
    short index2 = indices[i + 2]; 

    Vector3 vert0 = vertices[index0]; 
    Vector3 vert1 = vertices[index1]; 
    Vector3 vert2 = vertices[index2]; 

    if (vert0.Z > centerZ && vert1.Z > centerZ && vert2.Z > centerZ) 
    { 
     vert0 = Vector3.Zero; 
     vert1 = Vector3.Zero; 
     vert2 = Vector3.Zero; 
     indices[i] = short.MinValue; 
     indices[i + 1] = short.MinValue; 
     indices[i + 2] = short.MinValue;     
    } 
} 

но в конце я получаю что-то похожее на это, а не на модель, разрезанную пополам. Я совершенно новичок в программировании игр, и мое понимание вершин и индексов по-прежнему крайне мало. Очевидно, что мне не хватает чего-то действительно фундаментального, любая помощь была бы искренне оценена.

enter image description here

+0

Если вам не нужно делать это в режиме реального времени, можете ли вы сделать это в своем 3D-редакторе по выбору? Большинство инструментов имеют функцию среза, которая может регенерировать сетку для вас. Было бы намного проще. Желаю вам хорошо – MickyD

ответ

0

short.MinValue является -32767, так как короткий подписан, так что вы не должны использовать это, так как значение Indice для Vertice не может быть отрицательным. Вы должны использовать = 0 или ushort.MinValue. Также имейте в виду, что этот метод не будет полностью резать модель пополам, треугольники, перпендикулярные центру, будут по-прежнему оставаться.

Вы можете попробовать что-то вроде этого:

if (vert0.Z <= centerZ || vert1.Z <= centerZ || vert2.Z <= centerZ) 
{ 
    if (vert0.Z > centerZ) vert0.Z = centerZ; 
    if (vert1.Z > centerZ) vert1.Z = centerZ; 
    if (vert2.Z > centerZ) vert2.Z = centerZ;   
} 
else 
{ 
    indices[i] = 0; 
    indices[i + 1] = 0; 
    indices[i + 2] = 0; 
} 

Edit: также эта часть выглядит не так:

part.IndexBuffer.SetData<short>(vertices); 
part.VertexBuffer.SetData<Vector3>(indices); 

вы должны передать вершины к VertexBuffer и индексы к IndexBuffer. И вы, вероятно, должны использовать ushort по индексам, поскольку нет причин, чтобы показатель был отрицательным.