【问题标题】:Changing Camera (Oculus Rift) Position in Unity 5在 Unity 5 中更改相机(Oculus Rift)位置
【发布时间】:2015-08-18 12:41:06
【问题描述】:

使用Unity 5.1Oculus SDK 0.6 以及新的内置Virtual Reality Supported 复选框,我似乎无法更改相机在VR 中的位置。

当然,我可以更改相机的Tranform Position 组件编号(即x 和y 和z),但是当我在播放模式下运行时,很明显Oculus 的视觉相机 没有移动。

如何移动/更改 Oculus 的视角,以调整通过 2 个镜头看到 Unity 世界的方式?

【问题讨论】:

    标签: unity3d oculus virtual-reality


    【解决方案1】:

    将父 GameObject 添加到相机并移动那个,不要修改 VR 相机。

    【讨论】:

    • 感谢 ChanibaL。当您选中Virtual Reality Supported 选项时,每个新项目附带的Main Camera 是否与Oculus 使用的相机相同? VR相机是什么意思?由于消除了OVR 预制件等...当您勾选 Unity VR 框时,我很困惑实际发生了什么(例如相机方面)。你能解释一下吗?谢谢
    • OVRCamera 预制件发生的事情几乎相同,只是您无法在编辑器中控制它。惭愧,真的。不确定在类似的层次结构中是否有运行时添加的游戏对象(每只眼睛的相机等)。如果您还没有,请查看the official docs
    【解决方案2】:

    扩展 Krzysztof 的回答,我通常使用这样的东西(我将此组件附加到 VR 相机,给它一个空的游戏对象作为父对象,然后将该游戏对象设置为 vrCameraHolder):

    [RequireComponent(typeof(Camera))]
    public class VRPlayer : MonoBehaviour
    {
        // set to be the parent of this object
        public Transform vrCameraHolder;
    
        // simple utility functions
        public static Quaternion LocalToWorldRotation(Transform t, Quaternion localRot)
        {
            return t.rotation * localRot;
        }
        public static Quaternion WorldToLocalRotation(Transform t, Quaternion rot)
        {
            return Quaternion.Inverse(t.rotation) * rot;
        }
    
        // Gets the body part position in world space
        public Vector3 GetBodyPartPosition(UnityEngine.XR.XRNode bodyPart)
        {
            return vrCameraHolder.localToWorldMatrix.MultiplyPoint(UnityEngine.XR.InputTracking.GetLocalPosition(bodyPart));
        }
    
        // Gets the body part rotation in world space
        public Quaternion GetBodyPartRotation(UnityEngine.XR.XRNode bodyPart)
        {
            return LocalToWorldRotation(vrCameraHolder, UnityEngine.XR.InputTracking.GetLocalRotation(bodyPart));
        }
    
        // moves entire player body so that this becomes true
        public void SetBodyPartPosition(UnityEngine.XR.XRNode bodyPart, Vector3 pos)
        {
            Vector3 bodyPartPos = vrCameraHolder.localToWorldMatrix.MultiplyPoint(UnityEngine.XR.InputTracking.GetLocalPosition(bodyPart));
            vrCameraHolder.position += pos - bodyPartPos;
        }
    
    
        // if you want to change rotation you should probably only use this to keep the headset tilted the same way (y axis is up, so 0 is forward along x axis, 180 is backwards along x axis, 90 and 270 are along z axis, etc.)
        public void SetBodyPartYRotation(UnityEngine.XR.XRNode bodyPart, float yRot)
        {
            Vector3 curRot = GetBodyPartRotation(bodyPart).eulerAngles;
            SetBodyPartRotation(bodyPart, new Vector3(curRot.x, yRot, curRot.z));
        }
    
        // rotates entire player body so that this becomes true (but doesn't change position)
        public void SetBodyPartRotation(UnityEngine.XR.XRNode bodyPart, Quaternion rot)
        {
            Quaternion curWorldRot = GetBodyPartRotation(bodyPart);
            Quaternion cancelOutWorldRot = Quaternion.Inverse(curWorldRot);
            float angle1;
            Vector3 axis1;
            cancelOutWorldRot.ToAngleAxis(out angle1, out axis1);
            Vector3 bodyPartPosition = GetBodyPartPosition(bodyPart);
            vrCameraHolder.RotateAround(bodyPartPosition, axis1, angle1);
            // now player rotation = not rotated
            float angle2;
            Vector3 axis2;
            rot.ToAngleAxis(out angle2, out axis2);
            vrCameraHolder.RotateAround(bodyPartPosition, axis2, angle2);
        }
    
        // rotates entire player body so that this becomes true (but doesn't change position)
        public void SetBodyPartRotation(UnityEngine.XR.XRNode bodyPart, Vector3 eulerAngles)
        {
            SetBodyPartRotation(bodyPart, Quaternion.Euler(eulerAngles));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2016-08-11
      相关资源
      最近更新 更多