如何在当前设备方向启用陀螺仪相机
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 项目来做。
您需要在Awake
或Start
函数中获取偏移相机位置。在 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);
}
我想启用陀螺仪控制的相机 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 项目来做。
您需要在Awake
或Start
函数中获取偏移相机位置。在 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);
}