使用Hololens结合holotoolkit获取空间表面类型的其他方法咨询
基于HoloToolkit的空间表面类型识别替代实现方案
你设想的碰撞触发方案是可落地的,具体实现逻辑如下:
核心原理
HoloToolkit的Spatial Understanding模块在场景扫描阶段就已经完成了空间表面的自动分类,你不需要自行判断表面属性,直接调用模块内置API读取预存的分类标签即可。
具体实现步骤
- 首先确认Spatial Understanding的全场景扫描流程已完成,未完成扫描的场景不会生成完整的表面分类数据
- 给你需要用来触发碰撞的GameObject挂载触发器碰撞体,注意碰撞体尺寸要大于Spatial Mapping生成的网格默认面片间距,避免漏触发,同时勾选碰撞体的
Is Trigger属性 - 替换你原本的
OnTriggerEnter逻辑,不需要读取表面名称,直接调用API查询碰撞位置的表面类型即可,参考代码如下:
using HoloToolkit.Unity.SpatialMapping; using UnityEngine; public class SurfaceCollisionDetector : MonoBehaviour { private void OnTriggerEnter(Collider other) { // 先校验碰撞对象是否为空间映射生成的网格 if (other.gameObject.layer == SpatialMappingManager.Instance.Layer) { // 获取碰撞接触点坐标 Vector3 contactPoint = other.ClosestPointOnBounds(transform.position); // 调用SpatialUnderstanding接口查询表面类型 SurfaceType surfaceType = SpatialUnderstanding.Instance.UnderstandingDLL.GetStaticSurfaceTypeAtPosition(contactPoint); // 根据类型处理业务逻辑 switch(surfaceType) { case SurfaceType.Floor: // 地面逻辑 break; case SurfaceType.Wall: // 墙面逻辑 break; case SurfaceType.Ceiling: // 天花板逻辑 break; case SurfaceType.Table: // 桌面逻辑 break; default: // 未分类表面逻辑 break; } } } }
轻量化替代方案
如果你不需要使用Spatial Understanding的其他功能,也可以直接通过碰撞点的网格法向量判断表面类型,不需要等待扫描完成,性能消耗更低:法向量Y值接近1为地面,Y值接近-1为天花板,Y值接近0为墙面。
内容的提问来源于stack exchange,提问作者Zaki
相关产品推荐
相关产品推荐

