我想启用陀螺仪控制的摄像头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: 测试变得令人困惑,所以我把代码放回到你的解决方案的建议。还有一个小问题,但看起来这个脚本非常接近。主要问题是当我运行每个测试时,屏幕看起来不像上面的图片,在设备上以奇怪的角度启动应用程序。应用程序启动时设备的角度确实无关紧要,当指向北方和纵向时,它需要看起来像上面的屏幕。
我需要做更多的测试,并且会使用一个新的/干净的项目。
答案 0 :(得分:1)
您需要在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);
}