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 的光线投射问题的主要内容,如果未能解决你的问题,请参考以下文章

用于游戏开发和其他目的的光线投射教程

用于游戏开发和其他目的的光线投射教程

用于游戏开发和其他目的的光线投射教程

微软Hololens遭遇失败,前途何在?

在 Unity 中沿光线投射实例化预定义数量的对象

光线追踪、光线投射、光线行进和路径追踪有啥区别?