从鼠标通过扭曲矩阵投射光线

3

我已经在论坛、Oculus论坛和Unity论坛上搜索了很久,但没有找到有用的信息。

我正在开发一款车辆模拟游戏。在我们使用Oculus之前,它只是一个普通的第一人称视角。您可以使用方向盘/踏板驱动,并使用鼠标控制所有按钮和开关等。我们使用射线投射从屏幕上的鼠标点到世界中与车辆的各种控件进行交互。

现在我们正在使用Oculus,但是射线投射并没有考虑到Oculus相机使用的畸变矩阵。因此,您实际上并没有将光线投射到您所看到的物体上。通过使用Debug.DrawRay,我发现它稍微偏移了一点。为了确保,我通过检查OVRCameraController的检查器禁用了镜头校正,结果发现射线投射又能够工作了。

射线本身是从鼠标点计算出来的:ScreenPointToRay(Input.mousePosition);

请问有什么办法可以调整我的射线,使其可以与镜头校正配合使用吗?

谢谢, Gordon

2个回答

1

只需将畸变矩阵与光线向量(位置和法线)相乘,即可得到新的光线。建议使用齐次坐标和4x4矩阵以及Vec4,其中位置具有w = 1.0的分量,法线具有w = 0.0的分量;这样,您只需简单地相乘即可完成 - 根据查找方向,您可能需要使用逆矩阵 :)


0

好的,我最终做的是创建了一个三维光标,并完全绕过了扭曲矩阵。

我在与“头部”(左眼和右眼相机之间)相同的位置放置了一个游戏对象。它有一个脚本,根据鼠标移动上下/左右旋转。然后,我临时将一个聚光灯放在其上,具有狭窄的锥形和高强度,使其看起来像激光指针。我想,如果光线击中物体,那么从相同起点发射的射线也应该如此,结果发现确实可以。

然而,这并没有真正解决使用光标的问题。我尝试了许多最终都不起作用的方法(与光线/射线命中的位置不对齐)。

最后我意识到自己忽略了非常简单的事情。我将摄像机的近剪切平面降低,并尽可能靠近相机放置了一个可见的平面。然后我将其在本地y轴上旋转180度,使其对相机不可见且不会阻塞射线投射。

然后我添加了一些代码,当射线命中物体时,它会从命中点向起点发射第二条射线。在其路径上,它必须经过平面,该平面基本上位于近剪切平面上。然后我将我的三维光标移动到命中点。

现在它按照预期工作了。光标所在的位置就是原始射线投射的位置。光标现在与激光点的位置匹配。然后我移除了光组件。完成。
希望这能帮助到其他人。

也许你可以将文本分成几个段落以提高可读性。 - M. Mimpen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接