Arqueología digital y realidad virtual o cómo intenté hacerme amigo de BIM y VR

Todas las nuevas tecnologías de moda tienen una base masiva que las antiguas y, a veces, para trabajar con ellas, debe profundizar en el grosor de las capas históricas y, con sorpresa, encontrar allí herramientas convenientes y muy oportunas.



Tenía la tarea de mostrar un modelo BIM en realidad virtual, o más bien exportar desde Revit. Desde el punto de vista del resultado final, había dos opciones: Unity o A-Frame. Para la exportación, quería un formato abierto del que solo estuviera IFC. Por lo tanto, primero miré el proyecto xBIM: tenían un proyecto de visor web xBIM WeXplorer con su propio formato wexBIM. Pero allí utilizamos nuestro propio renderizado a través de WebGL, y la exportación a wexBIM no funcionó en la versión actual de XbimXplorer y no encontré una descripción del formato.

Luego tuve la idea de usar export en Tree.js, en un momento experimentamos mucho con él, y A-Frame es solo un contenedor en Tree.js. Descubrí que Jeremy Tammik y sus colegas ya han implementado uno similar: exportar de Revit a Tree.js a través de su formato json, en github hay dos repositorios para exportar desde Revit: CustomExporterAdnMeshJson y 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

mi resultado de este hilo

Pero además de exportar, necesitaba escribir código para importar, me pareció excesivo y busqué un formato abierto adecuado y lo encontré rápidamente: gltf / glb de Khronos Group, importar en A-Frame es elemental:

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

Para crear gltf / glb, se escribieron un montón de utilidades en el Grupo Khronos, incluido C # - SharpGLTF .

Crear gltf requiere crear los siguientes objetos: Modelo <= Escena <= Nodos <= Malla <= Material

  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"); 

Solo resta escribir exportación desde Revit, para esto estudié las utilidades Jeremy Tammik. Para la exportación, debe crear una clase que implemente la interfaz IExportContext, sus métodos se invocan en un cierto orden cuando se exporta el modelo, estamos interesados ​​en la cadena principal Start => OnViewBegin => OnElementBegin => OnPolymesh. En el método Start crearemos un modelo gltf, en el método OnElementBegin creo una malla: aquí puede obtener la geometría del elemento, pero será un modelo brep y no es adecuado para gltf, en el próximo método OnPolymesh obtenemos la misma geometría que una malla que ya se puede guardar en gltf.

Se ejecuta el método OnInstanceBegin: si el elemento es un inserto de la familia, su geometría se obtendrá en su propio sistema de coordenadas y será necesario transformarlo en uno mundial. Necesitamos una pila para almacenar estos sistemas de coordenadas.

El método OnMaterial se realiza cuando se cambia el material, es mejor crear un diccionario de materiales y tomar el material necesario, en lugar de crear uno nuevo cada vez.

El método OnLinkBegin se ejecuta al procesar un enlace externo, en realidad un modelo anidado.

El método OnLight se ejecuta al procesar una fuente de luz

El método OnFaceBegin se ejecuta al procesar caras individuales de un elemento; se llama solo si la propiedad IncludeGeometricObjects = true

En principio, puede escribir el modelo completo en un nodo, pero quiero asociar elementos con datos de atributos en el futuro y, por lo tanto, escribo cada elemento en mi nodo usando su ElementId como nombre

Código de utilidad en git-hub

En Windows 10, hay dos programas regulares para ver glb (pero no gltf), este es un "Visor de realidad mixta" para ver



Y Paint 3D para editar



Como puede ver, renderizan los materiales de manera diferente y, en particular, manejan la transparencia de manera diferente (ambos no son correctos)

Pero para mí, lo mejor es VS Code + glTF Tools



A-Frame funciona en todos los navegadores modernos, pero solo puedes usar el casco en Firefox (y Supermedium, por supuesto). Tendremos que organizar el control, en A-Frame puede usar controles wasd para controlar el mouse, pero es mejor usar controles de movimiento de la extensión A-Frame Extras . Para usar los controladores Vive, necesitas agregar controles Vive. Código de página completa en 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> 



Por cierto, git-hub es adecuado para hosting VR; =)

Puede usar el complemento UnityGLTF para importar glb en Unity; si está interesado, puedo pintar cómo usarlo, pero no hay nada complicado.

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


All Articles