如何在当前设备方向启用陀螺仪相机

How to enable gyroscope camera at current device orientation

我想启用陀螺仪控制的相机 onButtonClick 事件,但我希望它从相机的当前位置开始。目前,当启用陀螺仪时,它会将相机移到一个新位置(可能是设备当前的陀螺仪旋转),而不是将其留在原处并从该点开始陀螺仪。

希望我说得有道理,但基本上我不希望用户注意到他们在游戏中看到的任何变化(即由陀螺仪控制的相机,但用户不会注意到这种变化)。这是我正在使用的代码:

void Update () 
{
    Quaternion attitudeFix = new Quaternion (-gyro.attitude.x, -gyro.attitude.z, -gyro.attitude.y, gyro.attitude.w);
    Quaternion offsetRotation =  initialGyroRotation * attitudeFix;
    rotation = initialRotation * offsetRotation;
    transform.rotation = rotation;
}

public void EnableGyro() 
{
    initialGyroRotation = Input.gyro.attitude;
    initialRotation = transform.rotation;

    Debug.Log("initialRotation: " + initialRotation.ToString());
    Debug.Log("transform.rotation: " + transform.rotation.ToString());
    Debug.Log("initialGyroRotation: " + initialGyroRotation.ToString());
}

**

编辑: 这是一个屏幕,显示了当用户将他们的设备放在他们的脸前(纵向)并向北行驶时,我希望视图看起来如何。无论应用程序启动时设备的方向如何,这都是以 phone 纵向向北时的外观(再次当用户通过 phone 观看时)。

编辑 2: 测试变得令人困惑,所以我将代码放回到您的解决方案所建议的位置。仍然有一个小问题,但看起来这个脚本已经很接近了。主要问题是当我 运行 每次测试时屏幕看起来不像上图,以奇怪的角度启动应用程序。启动应用程序时设备的角度真的无关紧要,它需要在指向北方和纵向时看起来像上面的屏幕。

我需要做更多的测试,并且会用一个 new/clean 项目来做。

您需要在AwakeStart函数中获取偏移相机位置。在 Update 函数中,将该偏移值应用于陀螺仪传感器的值。

您似乎已经知道应该使用偏移量,但您的做法不正确。令人困惑的部分是获取偏移量,这需要从陀螺仪传感器值中减去当前相机旋转。

要减去 Quaternion 乘以 Inverse 而不仅仅是 Quaternion:

Quaternion = Quaternion *Quaternion.Inverse

要添加 Quaternion 乘以 Quaternion:

Quaternion = Quaternion * Quaternion.

您的代码应如下所示:

Quaternion offset;

void Awake()
{
    Input.gyro.enabled = true;
}

void Start()
{
    //Subtract Quaternion
    offset = transform.rotation * Quaternion.Inverse(GyroToUnity(Input.gyro.attitude));
}

void Update()
{
    GyroModifyCamera();
}

void GyroModifyCamera()
{
    //Apply offset
    transform.rotation = offset * GyroToUnity(Input.gyro.attitude);
}

private static Quaternion GyroToUnity(Quaternion q)
{
    return new Quaternion(q.x, q.y, -q.z, -q.w);
}