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

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

**

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

在此处输入图像描述

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

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

您需要在AwakeStartfunction中获取偏移摄像机位置。 在Updatefunction中,将该偏移值应用于陀螺仪传感器的值。

看起来你已经知道应该使用偏移,但你没有采用正确的方式。 令人困惑的部分是获得偏移,这需要从陀螺仪传感器值中减去当前相机旋转。

要减去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(qx, qy, -qz, -qw); }