Проблемы импорта IFC в Unity3D

Я пишу вам это письмо, потому что у меня возникли проблемы с созданием скрипта в Unity 3D (версия 5.3.4f1). Сначала я попробовал с assimpNet 3.0 (потому что я понял, что он работает лучше), но когда я пытаюсь получить древовидную структуру моего файла ifc, он не работает на самом деле… скрипт дает другую древовидную структуру (например, я получаю узлы fiew и затем один узел с 7 мешами, но в файле ifc у меня есть 2 узла, первый с 6 мешами, а второй с 1 сеткой), а затем мои индикаторы ячеек не хороши, поэтому он не работает… я могу получить хороший мешается с другими PostProcessSteps, но у меня есть только один игровой объект из-за optimizeGraph.

Поэтому я попытался с AssimpNet 3.3.1 (с исходным кодом, я сделал DLL, способный работать с единством). Но теперь у меня возникает другая проблема, когда я пытаюсь импортировать мой файл с помощью:

Assimp.Scene model2 = import.ImportFile("sample02.ifc", PostProcessPreset.TargetRealTimeMaximumQuality);

Я получаю эту ошибку:

AssimpException: Error importing file: The string "E-006,#14,$)" cannot be converted into a value.

Assimp.AssimpContext.ImportFile (файл System.String, PostProcessSteps postProcessFlags) ImportIFC.Start () (в разделе Активы / Тесты /ImportIFC/ImportIFC.cs:51)

Таким образом, скрипт находит файл, но не может его прочитать…

Я даю вам свой исходный код, и если у вас есть какие-либо вопросы, я буду очень рад ответить вам: Мой класс, чтобы получить информацию:

using UnityEngine;

использование System.Collections; используя Assimp;

открытый класс MainNodeIFC {

public string name;

public UnityEngine.Mesh[] meshes;
public MainNodeIFC[] children;

}

Мой основной код:

public class ImportIFC : MonoBehaviour

{

// Use this for initialization
void Start()
{


    //using assimpNet 3.3.1
    AssimpContext import = new AssimpContext();

    //using assimpNet 3.0
    //AssimpImporter import = new AssimpImporter();

    import.SetConfig(new NormalSmoothingAngleConfig(66.0f));

    //using assimpNet 3.3.1
    Assimp.Scene model2 = import.ImportFile("sample02.ifc", PostProcessPreset.TargetRealTimeMaximumQuality);
    print("rootNode name: " + model2.RootNode.Name);


    //using assimpNet 3.0
    //can get good import of meshes but erase the tree structure
    /*Assimp.Scene model1 = import.ImportFile(fileName,
        //PostProcessSteps.FindInstances | // No effect + slow?
            PostProcessSteps.FindInvalidData |
            PostProcessSteps.FlipUVs |
            PostProcessSteps.FlipWindingOrder |
        //PostProcessSteps.MakeLeftHanded | // Appears to just mess things up
            PostProcessSteps.JoinIdenticalVertices |
            PostProcessSteps.ImproveCacheLocality |
            PostProcessSteps.OptimizeMeshes |
        PostProcessSteps.OptimizeGraph | // Will eliminate helper nodes
            PostProcessSteps.RemoveRedundantMaterials |
            PostProcessSteps.Triangulate 
            );*/
    //using assimpNet 3.0
    //can get the good tree structure but not the good meshes
    //Assimp.Scene model2=import.ImportFile(fileName, PostProcessPreset.TargetRealTimeMaximumQuality);
    //Assimp.Scene model2 = import.ImportFile(fileName, PostProcessPreset.TargetRealTimeQuality);



   /* MainNodeIFC MainNode1 = new MainNodeIFC();
    GameObject go1 = new GameObject();
    go1.name = model1.RootNode.Name;
    ImportNode(model1.RootNode, MainNode1, model1, go1);*/

    MainNodeIFC MainNode2 = new MainNodeIFC();
    GameObject go2 = new GameObject();
    go2.name = model2.RootNode.Name;
    ImportNode(model2.RootNode, MainNode2, model2, go2);




}



// Update is called once per frame
void Update()
{


}








void ImportNode(Node refNode, MainNodeIFC newNode, Assimp.Scene model, GameObject go)
{


    if (refNode.HasChildren)
    {


        //create new array of node children
        newNode.children = new MainNodeIFC[refNode.ChildCount];
        print(" node: " + refNode.Name + " nombre d'enfant: " + refNode.ChildCount);
        print("type du node: " + refNode.GetType().ToString());

        for (int i = 0; i < refNode.ChildCount; i++)
        {

            //create the child node
            newNode.children[i] = new MainNodeIFC();
            //create the game object for the node
            GameObject childGo = new GameObject();
            MeshFilter mf = childGo.AddComponent(typeof(MeshFilter)) as MeshFilter;
            MeshRenderer mr = childGo.AddComponent(typeof(MeshRenderer)) as MeshRenderer;
            childGo.transform.parent = go.transform;
            childGo.name = refNode.Children[i].Name;

            //Set transform 
            Assimp.Vector3D position, scaling;
            Assimp.Quaternion rotation;
            refNode.Transform.Decompose(out scaling, out rotation, out position);
            childGo.transform.localPosition = new Vector3(position.X, position.Z, position.Y);
            childGo.transform.localRotation = new UnityEngine.Quaternion(rotation.X, rotation.Z, rotation.Y, rotation.W);
            childGo.transform.localScale = new Vector3( scaling.X, scaling.Z, scaling.Y );


            //recursive methode to get all the children node

            ImportNode(refNode.Children[i], newNode.children[i], model, childGo);

        }

    }

        if (refNode.HasMeshes)
        {
            //create array of meshes of this
            newNode.meshes = new UnityEngine.Mesh[refNode.MeshCount];

            print("final node : "+refNode.Name+"a comme enfant: " + refNode.MeshCount);
            print("type du node: " + refNode.GetType().ToString());

            //create the game object for the mesh
            /* */


            for (int i = 0; i < refNode.MeshCount; i++)
            {
                GameObject childGo = new GameObject();
                MeshFilter mf = childGo.AddComponent(typeof(MeshFilter)) as MeshFilter;
                MeshRenderer mr = childGo.AddComponent(typeof(MeshRenderer)) as MeshRenderer;
                childGo.transform.parent = go.transform;
                childGo.name = i.ToString();
                print("nb faces: " + model.Meshes[refNode.MeshIndices[i]].FaceCount);
                //set tranform
                Assimp.Vector3D position, scaling;
                Assimp.Quaternion rotation;
                refNode.Transform.Decompose(out scaling, out rotation, out position);
                childGo.transform.localPosition = new Vector3(position.X, position.Z,-position.Y);
                childGo.transform.localRotation = new UnityEngine.Quaternion(rotation.X, rotation.Z, rotation.Y, rotation.W);
                childGo.transform.localScale = new Vector3( scaling.X, scaling.Z, scaling.Y );

                List<Vector3> verticeTmp = new List<Vector3>();



                //get vertices from model
                Vector3 VectTmp = new Vector3();
                for (int j = 0; j < model.Meshes[refNode.MeshIndices[i]].VertexCount; j++)
                {

                    VectTmp = new Vector3(model.Meshes[refNode.MeshIndices[i]].Vertices[j].X,
                        model.Meshes[refNode.MeshIndices[i]].Vertices[j].Z,
                        model.Meshes[refNode.MeshIndices[i]].Vertices[j].Y);//warning axe Y et Z inverse

                    verticeTmp.Add(VectTmp);
                }


                //set normal : actually doesn’t work

                /* var norm = model.Meshes[refNode.MeshIndices[i]].HasNormals ? model.Meshes[refNode.MeshIndices[i]].Normals[i] : new Vector3D();
                 var texC = model.Meshes[refNode.MeshIndices[i]].HasTextureCoords(0) ? model.Meshes[refNode.MeshIndices[i]].GetTextureCoords(0)[i] : new Vector3D();
                 var tan = model.Meshes[refNode.MeshIndices[i]].HasTangentBasis ? model.Meshes[refNode.MeshIndices[i]].Tangents[i] : new Vector3D();
                 newNode.meshes[i].normals[0].x = norm.X;
                 newNode.meshes[i].normals[0].y = norm.Y;
                 newNode.meshes[i].normals[0].z = norm.Z;*/



                //set vertices and triangle
                newNode.meshes[i] = new UnityEngine.Mesh();

                newNode.meshes[i].SetVertices(verticeTmp);
                newNode.meshes[i].triangles = model.Meshes[i].GetIndices();

                //draw the mesh
                mf.mesh = newNode.meshes[i];
            }
        }

}

}

извините за мой английский, я тоже студент-френш.

Спасибо за внимание!

0 ответов

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