在前面的配置过程中,场景理解模拟的现实环境是自带碰撞体的,因为组成它们的Plane/Volume Prefab是自带碰撞体的,但是在实际运行之后,物体之间虽然可以实现碰撞效果,但是没有体现出弹性来,这时可以向碰撞体组件添加物理材质,通过提高Bouncines属性对其施加一定的弹性值,这样物体在与环境发生碰撞时,就有了一定的弹性,看起来更加真实。
但这样的物理效果其实还是有些粗糙了,因为这种虚拟空间是按照之前在空间设置时对现实场景中的边界的扫描所生成的,所以非常地平整,并不能很好地还原现实场景,所以,GlobalMesh就来了。
使用场景扫描还原现实场景
在Assets/StarterSamples中搜索到Global Mesh Collider,
将其赋给OVR Scene Manager的Prefab Overrides这一栏,并选择Global_MESH标签
Quest3在进行空间设置的时候,首先会有一个自动扫描环境的步骤,设备会对现实场景建立场景网格,这就是场景网格——GlobalMesh,它们是由三角面组成的,被记录在场景模型之中。
带有碰撞效果的GlobalMesh Collider添加GLOBAL_MESH标签之后,也就成为了场景网格的一部分,它们都是依靠Meta的Mesh API实现的。
现实场景的网格基本就像这样子,由Plane Prefab和Volume Prefab组成,这些Plane Prefab和Volume Prefab与我们之前创建的Plane Prefab和Volume Prefab不同,它们在系统进行空间扫描的过程的时候就被生成了,而之前的平面和立方体都是我们自己创建的。
系统生成的Plane Prefab和Volume Prefab
二者都有OVR Scene Anchor脚本,代表它们都属于场景锚点,OVR Semantic Classification则是语义标签组件,如左边的Plane Prefab的Labels属性为Floor,代表它是现实场景中的地板,右边的Volume Prefab的Labels为TABLE,DESK,代表它是现实场景中的桌子。
不同的是,Volume Prefab不仅具有OVR Scene Volume脚本,还有OVR Scene Plane脚本,这是因为立方体在场景内的面需要OVR Scene Plane脚本,所以Plane Prefab不是平面,也就只有OVR Scene Plane脚本,没有OVR Scene Volume脚本。
后者比前者的精度更高,这是因为前者是按照现实空间中的边界进行场景模拟的,所以看起来方方正正,后者则是依据空间设置中的扫描过程中得到的场景数据进行还原的,所以更加地近似于现实空间中的布局。
既然使用了Global Mesh Collider,那么Plane Prefab与Volume Prefab属性也可以去掉,因为一旦配置了GLOBAL_MESH,那么整个场景网格使用的就是场景扫描过程中缓存的Global Mesh数据,而不需要再使用平面和立方体的预制体去模拟现实空间。