Экспорт Blender в obj портит мои нормальные

У меня возникли небольшие проблемы с экспортером Wavefront Blender.

На самом деле я разрабатываю парсер для.obj меш. Я создал сетку в Blender, настроил ее UV, нормали и так далее... Когда я загружаю эту сетку с помощью моего загрузчика, UV размещаются правильно, но не нормали, на самом деле они все перевернуты!
Если я переверну все нормали в Blender, сетка будет правильно отображаться в моем приложении. Странно то, что если создать простой куб, экспортировать его, загрузить, отобразить в моем приложении, он будет отображаться правильно, без необходимости "плохо" переключать в Blender.
Я много пробовал с параметрами экспортера, я установил гладкую сетку так, чтобы я был уверен, что получаю по каждой вершине нормали...
Я попытался, включив / выключив выборку задней поверхности, на самом деле я много чего пробовал в интернете безрезультатно.

Вот немного моего кода:

//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

0 ответов

Другие вопросы по тегам