从OBJ提供的Xna绘制立方体

时间:2013-11-10 20:46:45

标签: xna draw primitive .obj indexed

我从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无
关了 f 5 // 1 6 // 1 1 // 1
f 6 // 2 7 // 2 2 // 2
f 7 // 3 8 // 3 3 // 3
f 8 // 4 5 // 4 4 // 4
f 1 // 5 2 // 5 4 // 5
f 8 // 6 7 // 6 5 // 6
f 6 // 1 2 // 1 1 // 1
f 7 // 2 3 // 2 2 // 2
f 8 // 3 4 // 3 3 // 3
f 5 // 4 1 // 4 4 // 4
f 2 // 5 3 // 5 4 // 5
f 7 // 6 6 // 6 5 // 6

我按行逐行加载顶点并将它们存储在数组中。然后指示(我猜想以'f'开头的行)存储到Indicies数组,这样就像{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);
}

输出 http://i.imgur.com/3pLj0U9.png

[溶液] 检查导入算法生成的内容。由于迭代次数不好,我的指数搞得一团糟。我的坏:))

1 个答案:

答案 0 :(得分:1)

我建议使用FBX和标准的XNA内容导入系统。这简化了流程,因此您甚至不必编写导入程序;你只需将XNA指向你的内容,就可以用非常简单的命令绘制它。自己编写进口商是一个很好的练习,但在XNA平台上没有必要。