Unity VR - 传送脚本无法精确传送到我指向的位置

问题描述 投票:0回答:1

我对 Unity 和 VR 还很陌生。我必须实现一个传送脚本,而我唯一知道的是我无法移动相机本身,因为对其进行的任何更改都会立即被覆盖。相反,我使用 XR Origin 对象作为运动平台并移动它。该脚本作为组件添加到右手,本质上只是从手上获取 XR Origin 对象和 XR Ray Interactor 组件,当我按下触发器时,它会将 XR Origin 位置移动到射线击中传送区域的位置.

var hit = rayInteractor.TryGetHitInfo(out Vector3 position, out _, out _, out _);
if (hit && triggerPress.action.ReadValue<float>() == 1f)
    {
        player.transform.position = position;
    }

但是,如调试输出所示,实际相机最终并未处于正确的位置:

相机:(0.84, 0.92, -0.94),XR原点:(1.74, 0.00, -2.55),射线命中位置:(1.74, 0.00, -2.55)

我确实理解为什么会发生这种情况。 XR Origin 对象是一个 1 平方米的区域,相机可以位于该区域内的任何点,因此当我更改 XR Origin 对象的位置时,相机可能根本不在对象的中间。我可以通过将 X 和 Z 的 XR 原点比例设置为 0.1 来解决这个问题,这确实会产生非常完美的精度:

相机:(4.02, 0.97, 0.14),XR原点:(4.09, 0.00, 0.00),射线命中位置:(4.09, 0.00, 0.00)

然而,这也破坏了视觉效果。手太小,距离相机超远:

in both screenshots the headset is at head height and the controller is lying on a table

我该如何编写一个传送脚本,在不破坏任何视觉效果的情况下将我传送到确切的位置?难道还有什么我不知道的窍门吗?大多数教程对我来说完全没用,因为我需要在 VS 中进行传送,而不仅仅是在 Unity 本身中

编辑:这是一个屏幕截图,显示有时差异有多么极端 red circle marks where I actually ended up at

编辑 2:所以有两个想法如何修复它:1)也许相机设置在 XR Origin 对象内的固定位置,我只需要调整相机的起始位置,2)我可以计算之间的差异相机和目的地并将其添加到 XR 原点位置。不过,我要到下周才能测试

unity-game-engine virtual-reality
1个回答
0
投票

我认为,如果您只移动

XROrigin
,您的相机仍然保持与以前相同的相对偏移量。

我的意思是

  • 假设您从
    XROrigin (0,0,0)
    Camera (1, 0, 0)
    开始(因为您已经走到了右边)
  • 现在运行脚本并移动
    XROrigin (0, 0, 1)

我希望你的相机实际上最终会在

(1, 0, 1)
处保持偏移。

我认为你应该使用的是

XROrigin.MoveCameraToWorldLocation(Vector3)

此功能将相机移动到

desiredWorldLocation
提供的世界位置。它通过移动
XR Origin
对象来实现此目的,以便相机的世界位置与
desiredWorldLocation

相匹配
var hit = rayInteractor.TryGetHitInfo(out Vector3 position, out _, out _, out _);
if (hit && triggerPress.action.ReadValue<float>() == 1f)
{
    player.GetComponent<XROrigin>().MoveCameraToWorldLocation(position);
}

可能想保持当前的相机高度

var hit = rayInteractor.TryGetHitInfo(out Vector3 position, out _, out _, out _);
if (hit && triggerPress.action.ReadValue<float>() == 1f)
{
    var xrOrigin = player.GetComponent<XROrigin>();
    position.y = xrOrigin.Camera.transform.position.y;
    xrOrigin.MoveCameraToWorldLocation(position);
}

注意:关于

triggerPress.action.ReadValue<float>() == 1f
,由于浮点精度,这可能会失败。您应该首先将您的操作相应地配置为仅在某个阈值时触发,然后使用
triggerPress.action.trigerred

© www.soinside.com 2019 - 2024. All rights reserved.