Archéologie numérique et réalité virtuelle ou comment j'ai essayé de me faire des amis avec le BIM et la VR

Toutes les nouvelles technologies à la mode ont une base massive par rapport aux anciennes et parfois pour travailler avec elles, vous devez vous plonger dans l'épaisseur des couches historiques et avec surprise, y trouver des outils pratiques et très opportuns.



J'ai eu la tâche d'afficher un modèle BIM en VR, ou plutôt d'exporter depuis Revit. Du point de vue du résultat final, il y avait deux options: Unity ou A-Frame. Pour l'exportation, je voulais un format ouvert, dont seul IFC l'était. Par conséquent, j'ai d'abord examiné le projet xBIM - ils avaient un projet de visualiseur Web xBIM WeXplorer avec leur propre format wexBIM. Mais là, nous avons utilisé notre propre rendu via WebGL, et l'exportation vers wexBIM ne fonctionnait pas dans la version actuelle de XbimXplorer et je n'ai pas trouvé de description du format.

Ensuite, j'ai eu l'idée d'utiliser l'exportation dans Tree.js, à un moment donné, nous en avons beaucoup expérimenté, et A-Frame n'est qu'un wrapper sur Tree.js. J'ai trouvé que Jeremy Tammik et ses collègues en avaient déjà implémenté un similaire - exportation de Revit vers Tree.js via son format json, sur github il y a deux référentiels pour l'exportation depuis Revit - CustomExporterAdnMeshJson et RvtVa3c.

github.com/va3c/RvtVa3c
github.com/jeremytammik/CustomExporterAdnMeshJson
thebuildingcoder.typepad.com/blog/2013/07/adn-mesh-data-custom-exporter-to-json.html
thebuildingcoder.typepad.com/blog/2014/08/threejs-aec-viewer-progress-on-two-fronts.html

mon résultat de ce fil

Mais en plus de l'exportation, j'avais besoin d'écrire du code pour l'importation, cela me semblait excessif et je suis allé à la recherche d'un format ouvert approprié et je l'ai rapidement trouvé - gltf / glb de Khronos Group, l'importation dans A-Frame est élémentaire:

<a-scene> <a-assets> <a-asset-item id="tree" src="/path/to/tree.gltf"></a-asset-item> </a-assets> <a-entity gltf-model="#tree"></a-entity> </a-scene> 

Pour créer gltf / glb, un tas d'utilitaires ont été écrits dans le groupe Khronos, y compris C # - SharpGLTF .

La création de gltf nécessite la création des objets suivants: Modèle <= Scène <= Nœuds <= Maillage <= Matériau

  var material1 = new MaterialBuilder() .WithAlpha(AlphaMode.MASK) .WithDoubleSide(true) .WithSpecularGlossinessShader() .WithChannelParam("BaseColor", new Vector4(1, 0, 0, 0.1f)); var ch = material1.UseChannel("MetallicRoughness"); var mesh = new MeshBuilder<VERTEX>("mesh"); var prim = mesh.UsePrimitive(material1); VERTEX tv = new VERTEX(-10, 0, 0); prim.AddTriangle(tv, new VERTEX(10, 0, 0), new VERTEX(0, 10, 0)); prim.AddTriangle(new VERTEX(10, 0, 0), tv, new VERTEX(0, -10, 0)); var mesh2 = new MeshBuilder<VERTEX>("mesh"); // create a new gltf model var model = ModelRoot.CreateModel(); // create a scene, a node, and assign the first mesh Scene scene = model.UseScene("Default"); scene.CreateNode().WithMesh(model.CreateMeshes(mesh)[0]); // save the model in different formats model.SaveAsWavefront("mesh.obj"); model.SaveGLB("mesh.glb"); model.SaveGLTF("mesh.gltf"); 

Il ne reste plus qu'à écrire l'export depuis Revit, pour cela j'ai étudié les utilitaires Jeremy Tammik. Pour l'exportation, vous devez créer une classe qui implémente l'interface IExportContext, ses méthodes sont appelées dans un certain ordre lorsque le modèle est exporté, nous nous intéressons à la chaîne principale Start => OnViewBegin => OnElementBegin => OnPolymesh. Dans la méthode Start, nous créerons un modèle gltf, dans la méthode OnElementBegin je crée un maillage - ici, vous pouvez obtenir la géométrie de l'élément, mais ce sera un modèle brep et il ne convient pas pour gltf, dans la méthode OnPolymesh suivante, nous obtenons la même géométrie qu'un maillage qui peut déjà être enregistré dans gltf.

La méthode OnInstanceBegin est exécutée - si l'élément est un insert de la famille, sa géométrie sera obtenue dans son propre système de coordonnées et il faudra le transformer en un monde. Nous avons besoin d'une pile pour stocker ces systèmes de coordonnées.

La méthode OnMaterial est effectuée lors du changement de matériau, il est préférable de créer un dictionnaire de matériaux et de prendre le matériel nécessaire, plutôt que d'en créer un nouveau à chaque fois.

La méthode OnLinkBegin est exécutée lors du traitement d'un lien externe - en fait un modèle imbriqué.

La méthode OnLight est exécutée lors du traitement d'une source lumineuse

La méthode OnFaceBegin est exécutée lors du traitement des faces individuelles d'un élément; elle est appelée uniquement si la propriété IncludeGeometricObjects = true

En principe, vous pouvez écrire le modèle entier dans un nœud, mais je veux associer des éléments avec des données d'attribut à l'avenir, et donc j'écris chaque élément sur mon nœud en utilisant son ElementId comme nom

Code utilitaire sur git-hub

Dans Windows 10, il existe deux programmes réguliers pour afficher glb (mais pas gltf), il s'agit d'un "Mixed Reality Viewer" pour afficher



Et Paint 3D pour l'Ă©dition



Comme vous pouvez le voir, ils rendent les matériaux différemment et, en particulier, gèrent la transparence différemment (les deux ne sont pas corrects)

Mais pour moi, le meilleur est VS Code + Outils glTF



A-Frame fonctionne dans tous les navigateurs modernes, mais vous ne pouvez utiliser le casque que dans Firefox (et Supermedium, bien sûr). Nous aurons besoin d'organiser le contrôle, dans A-Frame, vous pouvez utiliser les contrôles wasd pour contrôler la souris, mais il est préférable d'utiliser les contrôles de mouvement de l'extension A-Frame Extras . Pour utiliser les contrôleurs vive, vous devez ajouter des contrôles vive. Code pleine page sur git-hub'e .

  <a-scene background="color: #ECECEC"> <a-assets> <a-asset-item id="ar1" src="house5.glb"></a-asset-item> </a-assets> <a-gltf-model src="#ar1" rotation="0 0 0"></a-gltf-model> <a-entity position="0 0 4" movement-controls="acceleration: 2000; fly: true" > <a-camera></a-camera> <a-entity vive-controls="hand: left"></a-entity> <a-entity vive-controls="hand: right"></a-entity> </a-entity> </a-scene> 



Soit dit en passant, git-hub est adapté à l'hébergement VR; =)

Vous pouvez utiliser le plugin UnityGLTF pour importer glb dans Unity - si cela vous intéresse, je peux peindre comment l'utiliser, mais il n'y a rien de compliqué.

Source: https://habr.com/ru/post/fr472264/


All Articles