数字考古学和虚拟现实,或者我如何尝试通过BIM和VR结识朋友

所有新的时尚技术都具有悠久的基础,有时要与它们一起使用,您需要深入研究历史图层的厚度,并在其中惊奇地找到方便,非常及时的工具。



我的任务是在VR中显示BIM模型,或者从Revit导出。 从最终结果的角度来看,有两个选择:Unity或A-Frame。 为了导出,我想要一种开放格式,只有IFC才可以。 因此,我首先看了xBIM项目-他们有一个带有自己的wexBIM格式的xBIM WeXplorer Web查看器项目 。 但是在那里,我们通过WebGL使用了自己的渲染,并且在当前版本的XbimXplorer中无法导出到wexBIM,并且找不到该格式的描述。

然后我有了在Tree.js中使用export的想法,一次我们做了很多实验,A-Frame只是Tree.js的包装。 我发现Jeremy Tammik及其同事已经实现了类似的方法-通过Revit通过json格式将其导出到Tree.js,在github上有两个从Revit导出的存储库-CustomExporterAdnMeshJson和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

我这个线程的结果

但是除了导出外,我还需要编写用于导入的代码,在我看来,这似乎过分了,我去寻找合适的开放格式并很快找到了它-Khronos Group的gltf / glb,导入A-Frame是基本的:

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

为了创建gltf / glb,Khronos Group中编写了许多实用程序,包括C# -SharpGLTF

创建gltf需要创建以下对象:模型<=场景<=节点<=网格<=材质

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

剩下的只是写Revit的导出,为此,我研究了Jeremy Tammik实用程序。 对于导出,您需要创建一个实现IExportContext接口的类,在导出模型时以特定顺序调用其方法,我们对主链Start => OnViewBegin => OnElementBegin => OnPolymesh感兴趣。 在Start方法中,我们将创建一个gltf模型,在OnElementBegin方法中,我创建一个网格-在这里您可以获取元素的几何形状,但这将是一个brep模型,并且不适合gltf,在下一个OnPolymesh方法中,我们将获得与可以保存在其中的网格相同的几何形状gltf。

执行OnInstanceBegin方法-如果元素是族的插入,则将在其自己的坐标系中获得其几何形状,并且有必要将其转换为世界坐标系。 我们需要一个堆栈来存储这些坐标系。

在更改材质时执行OnMaterial方法,最好创建材质词典并从中获取必要的材质,而不是每次都创建一个新的材质词典。

在处理外部链接(实际上是嵌套模型)时,将执行OnLinkBegin方法。

处理光源时执行OnLight方法

在处理元素的各个面时执行OnFaceBegin方法;仅当IncludeGeometricObjects属性= true时才调用

原则上,您可以在一个节点中编写整个模型,但是我以后希望将元素与属性数据相关联,因此我将每个元素都以其ElementId作为名称写入节点中

git-hub上的实用程序代码

在Windows 10中,有两个常规程序用于查看glb(但没有gltf),这是用于查看的“混合现实查看器”



和Paint 3D进行编辑



如您所见,它们对材质的渲染方式不同,尤其是对透明度的处理方式不同(两者都不正确)

但是对我来说-最好的是VS Code + glTF Tools



A-Frame可在所有现代浏览器中使用,但您只能在Firefox(当然还有Supermedium)中使用头盔。 我们将需要组织控件,在A-Frame中,您可以使用wasd-controls来控制鼠标,但是最好使用A-Frame Extras扩展中的移动控件。 要使用Vive控制器,您需要添加Vive控件。 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> 



顺便说一句,git-hub适用于VR托管; =)

您可以使用UnityGLTF插件将glb导入Unity-如果有兴趣,我可以画出如何使用它,但是没有什么复杂的。

Source: https://habr.com/ru/post/zh-CN472264/


All Articles