我在使用 Blender 的 Wavefront 导出器时遇到了一些问题。
实际上我正在为 .obj 网格开发一个解析器。我在 Blender 中创建了一个网格,设置了它的 UV、法线等等......当我用我的加载器加载这个网格时,UV 被正确放置但不是法线,实际上它们都被翻转了!
如果我在 Blender 中翻转所有法线,网格会正确显示在我的应用程序中。奇怪的是,如果创建一个简单的立方体,导出它,加载它,在我的应用程序中显示它,它会正确显示,而不必在 Blender 中“糟糕”地翻转。
我对导出器的参数进行了很多尝试,我设置了我的网格平滑,以便我确定我得到每个顶点法线......
我尝试通过设置背面剔除 ON/OFF,事实上我尝试了很多我发现的东西没有结果的互联网。
这是我的一些代码:
//I add information about vertices / uv / normals in 3 collections
//vertex
case "v":
l_vertex = new VPrimVertex(new VPrimVector3(Double.Parse(l_words[1]), Double.Parse(l_words[2]), Double.Parse(l_words[3])));
ListeVertices.Add(l_vertex);
break;
//vertex normal
case "vn":
ListeNormales.Add(new VPrimVector3(Double.Parse(l_words[1]), Double.Parse(l_words[2]), Double.Parse(l_words[3])));
break;
//vertex UV
case "vt":
//pas la même orientation UV entre Wavefront et WPF d'où le 1-V
ListeUVs.Add(new VPrimPointUV(Double.Parse(l_words[1]), 1.0-Double.Parse(l_words[2])));
break;
//face
case "f":
//pas un triangle
if (l_words.Length > 4)
{
Triangule(l_words);
}
//triangle
else
{
ComputeFace(l_words);
}
break;
. . .
Computeface(){
...
//for each face :
//for each vertex of a face :
//p_face[i] contains strings like v1/vt1/vn1
l_stringVertex = p_face[i].Split('/');
l_vertex = ListeVertices.ElementAt(int.Parse(l_stringVertex[0]) - 1);
l_vertex.AddAdjacent(l_face);
l_vertex.Normale = ListeNormales.ElementAt(int.Parse(l_stringVertex[2]) - 1);
l_face.AddVertex(l_vertex);
l_face.UVList.Add(m_listeUVs.ElementAt(int.Parse(l_stringVertex[1]) - 1));
...
}
然后我用所有这些数据填充 WPF MeshGeometry3D。
private void Finalise()
{
Point3D l_point3D;
Vector3D l_vector;
Point l_point;
VPrimPointUV l_pointUV;
int i;
foreach (VPrimFace l_face in Racine.SubdivideList)
{
i = 0;
foreach (VPrimVertex l_vertex in l_face.VertexList)
{
l_point3D = new Point3D(l_vertex.Position.X, l_vertex.Position.Y, l_vertex.Position.Z);
CurrentMesh.MeshGeometry3D.Positions.Add(l_point3D);
l_vertex.moyenneNormaleFacesAdjacentes();
l_vector = new Vector3D(l_vertex.Normale.X, l_vertex.Normale.Y, l_vertex.Normale.Z);
CurrentMesh.MeshGeometry3D.Normals.Add(l_vector);
if (Texture)
{
l_pointUV = l_face.UVList.ElementAt(i);
l_point = new Point(l_pointUV.U, l_pointUV.V);
CurrentMesh.MeshGeometry3D.TextureCoordinates.Add(l_point);
}
CurrentMesh.MeshGeometry3D.TriangleIndices.Add(CurrentMesh.MeshGeometry3D.Positions.Count-1);
i += 1;
}
}
}
如果您有任何想法...谢谢
在搅拌机 2.66