C# 通过删除顶点和索引将XNA模型一分为二
我正在尝试使用MonoGame(与XNA极为相似)将加载的3D模型切成两半。我不需要实时这样做,所以性能不是一个大问题 我使用C# 通过删除顶点和索引将XNA模型一分为二,c#,xna,monogame,indices,vertices,C#,Xna,Monogame,Indices,Vertices,我正在尝试使用MonoGame(与XNA极为相似)将加载的3D模型切成两半。我不需要实时这样做,所以性能不是一个大问题 我使用ModelMeshPart获取顶点和索引 Vector3[] vertices = new Vector3[part.NumVertices]; part.VertexBuffer.GetData<Vector3>(vertices); short[] indices = new short[part.PrimitiveCount * 3]; part.In
ModelMeshPart
获取顶点和索引
Vector3[] vertices = new Vector3[part.NumVertices];
part.VertexBuffer.GetData<Vector3>(vertices);
short[] indices = new short[part.PrimitiveCount * 3];
part.IndexBuffer.GetData<short>(indices);
Vector3[]顶点=新的Vector3[part.NumVertices];
part.VertexBuffer.GetData(顶点);
short[]索引=新short[part.PrimitiveCount*3];
部分IndexBuffer.GetData(索引);
然后使用
part.IndexBuffer.SetData<Vector3>(vertices);
part.VertexBuffer.SetData<short>(indices);
part.IndexBuffer.SetData(顶点);
部分.VertexBuffer.SetData(索引);
在此之前,尽管我使用这些数组并尝试清空位于模型中心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;
}
}
float centerZ=modelMesh.BoundingSphere.Center.Z;
对于(int i=0;icenterZ&&vert1.Z>centerZ&&vert2.Z>centerZ)
{
vert0=矢量3.0;
vert1=矢量3.零;
vert2=矢量3.零;
指数[i]=短的最小值;
指数[i+1]=short.MinValue;
指数[i+2]=short.MinValue;
}
}
但最终我得到的是这样的东西,而不是一个切成两半的模型。我对游戏编程完全陌生,我对顶点和索引的理解仍然非常差。很明显,我错过了一些非常基本的东西,任何帮助都将受到真诚的感谢
short.MinValue是-32767,因为short是有符号的,所以您不应该使用它,因为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;
}
if(vert0.Z centerZ)vert2.Z=centerZ;
}
其他的
{
指数[i]=0;
指数[i+1]=0;
指数[i+2]=0;
}
编辑:
这部分看起来也有问题:
part.IndexBuffer.SetData<short>(vertices);
part.VertexBuffer.SetData<Vector3>(indices);
part.IndexBuffer.SetData(顶点);
部分.VertexBuffer.SetData(索引);
应该将顶点传递给VertexBuffer,将索引传递给IndexBuffer。您可能应该在索引上使用ushort,因为没有理由索引是负数。如果您不需要实时执行此操作,您可以在您选择的3D模型编辑器中执行此操作吗?大多数工具都有一个切片功能,可以为您重新生成网格。那就容易多了。祝你平安