在xna DrawPrimitive中为Assimp Mesh渲染错误

我正在尝试使用从Blender作为OBJ导出的立方体呈现场景的顶点。 导入到XNA的8个顶点变成24,但是当我渲染它时,我没有看到所有的面。 这不是缺less网格的问题,因为我非常肯定这是作为第一个也是唯一的网格存储的。 我怀疑这是因为在Assimp Mesh对象中定义的向量,但我似乎无法find任何帮助。

这是解决! 该代码展示了如何仅使用具有顶点和索引缓冲区的Assimp和XNA渲染3D模型。 oScene是使用Assimp导入的Scene对象。 这个代码只能以没有纹理的单一颜色绘制面部。

这是相关的代码:

private void SetUpVertices() { mMesh = oScene.Meshes[0]; vertices = new VertexPositionColor[mMesh.VertexCount]; indices = new short[mMesh.FaceCount*3]; int i=0; foreach (Vector3D mVec in mMesh.Vertices) { vertices[i] = new VertexPositionColor(new Vector3(mVec.X, mVec.Y, mVec.Z), Color.Red); i++; } int f = 0; Face mFace; for (i = 0 ; i < mMesh.FaceCount*3 ; i=i+3) { mFace = mMesh.Faces[f]; f++; indices[i] = (short)mFace.Indices[0]; indices[i + 1] = (short)mFace.Indices[1]; indices[i + 2] = (short)mFace.Indices[2]; } vertexBuffer = new VertexBuffer(device, VertexPositionColor.VertexDeclaration, vertices.Length, BufferUsage.WriteOnly); vertexBuffer.SetData(vertices); indexBuffer = new IndexBuffer(device, typeof(short), indices.Length, BufferUsage.None); indexBuffer.SetData(indices); } private void SetUpCamera() { cameraPos = new Vector3(0, 5, 9); viewMatrix = Matrix.CreateLookAt(cameraPos, new Vector3(0, 0, 1), new Vector3(0, 1, 0)); projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, device.Viewport.AspectRatio, 1.0f, 200.0f); } protected override void Draw(GameTime gameTime) { device.Clear(ClearOptions.Target | ClearOptions.DepthBuffer, Color.DarkSlateBlue, 1.0f, 0); effect = new BasicEffect(GraphicsDevice); effect.VertexColorEnabled = true; effect.View = viewMatrix; effect.Projection = projectionMatrix; effect.World = Matrix.Identity; foreach (EffectPass pass in effect.CurrentTechnique.Passes) { pass.Apply(); device.SetVertexBuffer(vertexBuffer); device.Indices = indexBuffer; device.DrawIndexedPrimitives(Microsoft.Xna.Framework.Graphics.PrimitiveType.TriangleList, 0, 0, oScene.Meshes[0].VertexCount, 0, mMesh.FaceCount); } base.Draw(gameTime); } 

 device.DrawPrimitives(Microsoft.Xna.Framework.Graphics.PrimitiveType.TriangleStrip, 0, oScene.Mesh[0].VertexCount); 

我相信问题可能是您正在使用TriangleStrip而不是TriangleList。 它也主要似乎也是平局(基于我自己的快速testing使用你的平局)。 尝试这个:

 device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, oScene.Mesh[0].VertexCount, 0, triangleCount); 

你必须从oScene.Mesh [0]对象设置triangleCount(不知道Assimp是什么,对不起)。 我目前正在使用这样的绘图调用,从我自己的.OBJ导入程序加载的.OBJ文件工作正常。