Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过删除顶点和索引将XNA模型一分为二_C#_Xna_Monogame_Indices_Vertices - Fatal编程技术网

C# 通过删除顶点和索引将XNA模型一分为二

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

我正在尝试使用MonoGame(与XNA极为相似)将加载的3D模型切成两半。我不需要实时这样做,所以性能不是一个大问题

我使用
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模型编辑器中执行此操作吗?大多数工具都有一个切片功能,可以为您重新生成网格。那就容易多了。祝你平安