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

时间:2017-10-25 14:43:18

标签: c# unity3d quaternions gyroscope

我想启用陀螺仪控制的摄像头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());
}

**

编辑:这是一个屏幕,显示我希望视图看起来像用户将他们的设备放在他们的面前(肖像)和朝北。无论应用程序启动时设备的方向如何,这都是当用手机纵向向北移动时的样子(再次当用户通过手机查看时)。

enter image description here

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

我需要做更多的测试,并且会使用一个新的/干净的项目。

1 个答案:

答案 0 :(得分:1)

您需要在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);
}