Проблемы импорта 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];
}
}
}
}
извините за мой английский, я тоже студент-френш.
Спасибо за внимание!