我需要一个游戏对象指向北方,并且我想将其与 gyro.attitude 输入结合起来。我曾尝试一步完成此任务,但没有成功。也就是说,我无法制作任何我在网上找到的陀螺仪脚本,以满足始终指向北方的额外要求。相信我,我已经尝试了所有能找到的关于这个主题的脚本。我推断这是不可能的,而且认为这是可以做到的可能是愚蠢的;至少不是这样(即一体化)。我想你可能会说我推测你不能同时做两件事。然后我想通过分解职责也许可以达到同样的效果。也就是说,游戏对象始终通过 Y 轴指向北。太好了,像这样完成了:
_parentDummyRotationObject.transform.rotation = Quaternion.Slerp(_parentDummyRotationObject.transform.rotation, Quaternion.Euler(0, 360 - Input.compass.trueHeading, 0), Time.deltaTime * 5f);
当游戏对象在 Y 轴上指向北时,我想添加第二个游戏对象(本例中为摄像机),并使用 X 轴和 Z 轴上的陀螺仪输入进行旋转。我必须消除相机上的 Y 轴的原因是因为我得到了双旋转。当两个物体同时旋转(即摄像机和游戏对象)时,180 度旋转会在场景中产生 360 度旋转。请记住,我需要游戏对象始终根据设备指南针指向北方(IRL)。如果我的设备指向东方,那么我的游戏对象将在统一场景中旋转 90 度,因为它指向(旋转)北方。
我读过很多关于陀螺仪相机控制器的内容,我看到经常提到的一件事是,你不应该尝试在 1 或 2 轴上执行此操作(限制它),当使用四元数时,当你不知道你要做什么时,这是不可能的我正在做,而我显然没有这样做。
我已经尝试了这个已解决问题的所有 3 个解决方案:Unity - 陀螺仪 - 仅绕一个轴旋转 https://stackoverflow.com/questions/41927052/unity-gyroscope-rotation-around-one-axis-only并且每个都未能使我的相机在一个轴上旋转以满足我的旋转需求。我想我应该先让第一个轴工作,然后再用第二个轴搅浑水。顺便说一句,我的要求很简单,相机只能基于我设备的 X 轴在 1 个轴(任何方向)上旋转。如果我能解出 X,那么我认为获得 Z 陀螺仪输入来控制相机也很棒。到目前为止,我无法仅在 1 个轴 (X) 上控制相机。无论如何,这是我的发现......
第一个解决方案使用了Input.gyro.rotationRateUnbiased,完全不准确。也就是说,如果我将设备旋转几次,然后将手机/设备放在桌子上,则相机每次都会处于不同的旋转/位置。没有一致性。这是我第一次尝试/解决方案的代码:
<code>
private void Update()
{
Vector3 previousEulerAngles = transform.eulerAngles;
Vector3 gyroInput = Input.gyro.rotationRateUnbiased;
Vector3 targetEulerAngles = previousEulerAngles + gyroInput * Time.deltaTime * Mathf.Rad2Deg;
targetEulerAngles.y = 0.0f;
targetEulerAngles.z = 0.0f;
transform.eulerAngles = targetEulerAngles;
}
</code>
第二个解决方案非常一致,因为我可以旋转我的设备,然后将其放在桌子上,并且统一相机总是最终处于相同的位置/旋转/状态。我遇到的问题是相机会在一个轴(本例中为 X)上旋转,但当我在 y 或 x 轴上旋转设备时,它就会这样做。我的手机的任何类型的旋转/移动都会导致统一相机在 X 轴上移动。我不明白为什么我的手机的 y 旋转会导致相机在 X 轴上旋转。这是我的解决方案 #2 的代码:
private void Start()
{
Input.gyro.enabled = true;
startEulerAngles = transform.eulerAngles;
startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}
private void Update()
{
Vector3 deltaEulerAngles = Input.gyro.attitude.eulerAngles - startGyroAttitudeToEuler;
deltaEulerAngles.y = 0.0f;
deltaEulerAngles.z = 0.0f;
transform.eulerAngles = startEulerAngles - deltaEulerAngles;
}
第三个解决方案:我不确定如何完成最后一个解决方案,因此它从未真正起作用。当2轴归零时,相机只是从左向右翻转,或者从上翻转到下翻转;取决于哪个轴被注释掉。如果没有任何轴被注释掉(就像原始解决方案一样),相机将在所有轴上旋转。这是我的尝试 #3 的代码:
private void Start()
{
_upVec = Vector3.zero;
Input.gyro.enabled = true;
startEulerAngles = transform.eulerAngles;
}
private void Update()
{
Vector3 gyroEuler = Input.gyro.attitude.eulerAngles;
phoneDummy.transform.eulerAngles = new Vector3(-1.0f * gyroEuler.x, -1.0f * gyroEuler.y, gyroEuler.z);
_upVec = phoneDummy.transform.InverseTransformDirection(-1f * Vector3.forward);
_upVec.z = 0;
// _upVec.x = 0;
_upVec.y = 0;
transform.LookAt(_upVec);
// transform.eulerAngles = _upVec;
}
本来我以为这是我的技术,但是花了一个月的时间我开始觉得这是不可能的。但那是不可能的。我知道这需要吸收很多东西,但这是一个非常简单的概念。
有任何想法吗?
编辑:我想添加我的层次结构:
CameraRotator(带有脚本的父级)-> MainCamera(子级)
CompassRotator(父级)-> Compass(具有旋转父级脚本的子级)