Unity3D 光线投射与 Oculus Rift 集成/测量距离

Unity3D Raycasting with Oculus Rift Integration / Measuring the distance

我想使用 Oculus Rift 测量 Unity3D 游戏引擎中两点之间的距离。用户通过查看点 A,按键盘上的 alpha1 和 B,按键盘上的 alpha2 来定位这些点。我做到了这一点:

     #pragma strict

 private var measuring = false;
 private var startPoint : Vector3;
 private var dist;

 function Update() {
     var hit : RaycastHit; 
     if (Input.GetKeyDown(KeyCode.Alpha1)) {
         dist = 0.0f;
         if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), hit)) {
         // if (Physics.Raycast(transform.position, transform.forward, hit, 10)) {
            measuring = true;
            startPoint = hit.point; 
         }

     }
     if (measuring && Input.GetKeyDown(KeyCode.Alpha2)) {
         if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), hit)) {
         // if (Physics.Raycast(transform.position, transform.forward, hit, 10)) {
          dist = Vector3.Distance(startPoint, hit.point);
         }
     }
 }

 function OnGUI() {
     if (measuring) {
         GUI.Label(Rect(50,50,180,50), "Distance: " + dist.ToString());
     }
 }

我的问题是,此代码仅适用于标准主相机对象,但我想使用 Oculus 集成的 OVRCameraRig。我收到以下异常消息:

NullReferenceException: 对象引用未设置为对象的实例 MeasureInGame.Update () (在 Assets/MeasureInGame.js:11)

我在这个网站上找到了一个解决方案:https://kaharri.com/unity-gaming-shootingaiming-part3-oculus/ 我创建了一个 ShotSpawner 对象作为 OVRCameraRig 的子对象(这应该像相机前面的枪一样)并将 Raycast 更改为

     Physics.Raycast(transform.position, transform.forward, hit, 10) 

获取用户视图。但它似乎也不起作用。

如何使用 Oculus 主摄像头完成瞄准。我严格需要在我的待测物体上安装对撞机是否正确,或者是否有没有对撞机的解决方案?

问候

首先 - 你真的在 Oculus 上使用鼠标吗?当然可以,但标准方法是查看所选对象(光标位于视口中心)。在 oculus 集成中从 "middle" 眼睛投射光线 - 它是左眼和右眼的父对象。使用此光线而不是 Camera.main.ScreenPointToRay:

中的光线
// add a reference to the middleEyeGameobject 
// in your class and link it in the inspector
var ray=new Ray(middleEyeGameobject.transform.position, middleEyeGameobject.transform.forward);

此外,您不必指定 hit raycast 的距离(删除第四个参数 Physics.Raycast)。


对于附加问题,是的,所有东西都必须有一个与 Physics.Raycast 的对撞机。是的,还有其他方法可以做到这一点,但是 built in ones (2) 仍然需要对撞机(或类似的),尽管它们可以是虚拟的,而不是附加到对象上。

最好使用对撞机,也许在their own layer

你得到的 NullReferenceException 是因为你正在使用 Camera.main.ScreenPointToRay(Input.mousePosition) , camera.main 使用未为您的 OVRCameraRig 设置的 MainCamera 标签。如果 OVRCameraRig 应该是您的主相机,您可以将此相机的标签设置为 mainCamera,否则您可以参考此相机 (OVRCameraRig) 并使用 cameraRef.ScreenPointToRay(Input.mousePosition)。 :)