Hololens 2 的光线投射问题
Posted
技术标签:
【中文标题】Hololens 2 的光线投射问题【英文标题】:Raycast problems with Hololens 2 【发布时间】:2021-09-16 04:29:30 【问题描述】:我在 Unity 2019.4.9 中有一个适用于 Hololens 2 的 MRTK 应用程序,我需要将光线从相机投射到空间网格以创建对象实例。
以下方法返回一个带有与网格碰撞点的 RaycastHit,并需要 VIEWPORT 中的坐标作为参数(值介于 0 和 1 之间)。
(0, 0) = 左下角。
(1, 1) = 右上角。
按照这个方法,当我给出坐标(0.5,0.5)时,对象会正确显示。但是当我离开中心时,物体看起来离碰撞点越来越远。
对象倾向于放置在中心。 例如,如果我想放在右边,它看起来向左移位,每个方向都会发生相同的逻辑。越靠近屏幕边缘,精度越差。
有谁知道可能出了什么问题? 我正在使用 ViewportPointToRay。
private bool GetWorldPoint(Vector2 p, out RaycastHit hit)
hit = default;
Ray ray = Camera.main.ViewportPointToRay(p);
if (Physics.Raycast(ray, out RaycastHit h, Mathf.Infinity, spatialLayer))
hit = h;
return true;
return false;
【问题讨论】:
究竟如何获得作为参数传入的视口值? 位置是从另一个应用程序远程获取的。远程助理可以看到 Hololens 用户在其屏幕上看到的内容。如果助手点击他的屏幕,坐标会以 0 到 1 之间的值收集并发送到 Hololens 以启动光线投射并将对象放置在助手标记的位置。 具体是做:Input.MousePosition.x / Screen.width。纵轴也一样。 为什么不直接使用鼠标位置和 ScreenPointToRay 呢? 因为每个屏幕的宽高都不一样。例如,1920x1080 屏幕上的坐标 (0.5, 0.5) 为 (960, 540) 像素,而在 1280x720 屏幕上为 (640, 360)。 【参考方案1】:使用 MRTK 我建议你阅读更多关于 pointers 的内容,它们为你提供了一个统一的 API 来获取每种类型指针的世界交点,请参阅 Pointer Result
【讨论】:
以上是关于Hololens 2 的光线投射问题的主要内容,如果未能解决你的问题,请参考以下文章