【问题标题】:Rotate parent so child looks in a certain direction旋转父母,让孩子朝某个方向看
【发布时间】:2019-09-30 20:32:34
【问题描述】:

对象层次结构如下:

Player
   - OVRCameraRig
       - TrackingSpace
           - CentralEyeAnchor (Camera)

默认情况下,玩家最初面向正确的区域,但由于这在 VR 中,有人可能想要校准或“归位”玩家,以便相机面向场景,而无需在现实生活中面向该方向。这是使用 Oculus Quest,所以我基本上希望玩家旋转偏移量发生变化,以便相机看到场景。

脚本附加到 Player,vrCamera 作为 CentralEyeAnchor:

        Quaternion quat = Quaternion.Inverse(rotationOffset) * vrCamera.transform.rotation;

        Vector3 euler = quat.eulerAngles;
        euler.x = 0;
        euler.z = 0;
        transform.rotation = Quaternion.Euler(euler);

        rotationOffset = transform.rotation;

【问题讨论】:

    标签: c# unity3d rotation camera-calibration calibration


    【解决方案1】:

    首先,找到相机和玩家之间的相对旋转relativeRot,例如playerRotation == cameraRotation * relativeRot

    左边两边都乘以Inverse(cameraRotation),我们知道那么Inverse(cameraRotation) * playerRotation == relativeRot

    Quaternion relativeRot = Quaternion.Inverse(vrCamera.transform.rotation) * transform.rotation;
    

    然后,确定您希望相机具有的旋转角度。或许将Quaternion.LookRotation 与您希望相机看到的方向一起使用:

    Vector3 desiredCameraLookAtPoint;
    Vector3 desiredCameraLookDirection = desiredCameraLookAtPoint - vrCamera.transform.position;
    Quaternion desiredCameraRot = Quaternion.LookRotation(desiredCameraLookDirection);
    

    最后,使用相对旋转和所需的相机旋转来求解并分配玩家的旋转:

    transform.rotation = desiredCameraRot * relativeRot;
    

    【讨论】:

    • 很好的答案!我还将四元数结果中的 x 和 z 归零,并将 OVRCameraRig 位置归零。效果很好!
    • 小心编辑四元数的组成部分...如果用户做了诸如倾斜头部之类的事情,可能会导致意外情况。它在没有将组件归零的情况下工作吗?如果您需要微调相机的up 指向的方向,您应该可以将其用作LookRotation 的第二个(可选)参数...
    • 如果不将 x 和 z 归零,它就无法工作,这意味着它在代码不变的情况下指向所有地方。我应该澄清一下,我使用欧拉角将 x 和 z 归零,并在该结果上使用 Quaternion.Euler 来设置 transform.rotation。但是,当头部向上倾斜时,会出现一些将相机置于错误位置的结果。
    猜你喜欢
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多