我从Blender生成了Cube到.obj文件。喜欢这个:o Cube_Cube.001
V -1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 -1.000000
V 1.000000 -1.000000 1.000000
V -1.000000 -1.000000 1.000000
V -1.000000 1.000000 -1.000000
V 1.000000 1.000000 -1.000000
v 1.000000 1.000000 1.000000
V -1.000000 1.000000 1.000000
VN 0.000000 0.000000 -1.000000
VN 1.000000 0.000000 0.000000
VN 0.000000 0.000000 1.000000
VN -1.000000 0.000000 0.000000
VN 0.000000 -1.000000 0.000000
VN 0.000000 1.000000 0.000000
usemtl none
s 关闭
传真 5//1 6//1 1//1
传真 6//2 7//2 2//2
传真 7//3 8//3 3//3
传真 8//4 5//4 4//4
传真 1//5 2//5 4//5
传真 8//6 7//6 5//6
传真 6//1 2//1 1//1
传真 7//2 3//2 2//2
传真 8//3 4//3 3//3
传真 5//4 1//4 4//4
传真 2//5 3//5 4//5
传真 7//6 6//6 5//6
我逐行加载顶点并将它们存储在数组中。然后指示符(我想以"f"开头的行)存储到指示数组中,因此类似于 {4, 5, 0, 6, 7 ...}(由于顶点在数组中的位置而减少 1),然后创建数组 VertexPositionColors。
但是当我画基元时,立方体会变形。绘制方法:
GraphicsDevice.Clear(Color.CornflowerBlue);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;
effect.World = world;
effect.View = view;
effect.Projection = projection;
effect.VertexColorEnabled = true;
RasterizerState rs = new RasterizerState();
rs.CullMode = CullMode.None;
rs.FillMode = FillMode.WireFrame;
GraphicsDevice.RasterizerState = rs;
foreach (EffectPass pass in effect.CurrentTechnique.Passes)
{
pass.Apply();
GraphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, model.VertexPositionColors, 0, model.VertexPositionColors.Length, model.Indicies, 0, model.Indicies.Length / 3, model.VertexDeclarations);
}
输出https://i.stack.imgur.com/ZRROi.png
[解决方案]检查导入算法生成的内容。由于迭代错误,我的索引被搞砸了。我的坏:)
我建议使用FBX和标准的XNA内容导入器系统。 这简化了流程,因此您甚至不必编写导入器;您只需将XNA指向您的内容,就可以用很少的,非常简单的命令来绘制它。 自己编写导入器是一个很好的练习,但在 XNA 平台上没有必要。