gpt4 book ai didi

android - Unity - 陀螺仪 - 仅绕一个轴旋转

转载 作者:搜寻专家 更新时间:2023-11-01 07:47:02 32 4
gpt4 key购买 nike

我正在使用 Unity 制作一款使用陀螺仪的游戏。我正在尝试检测设备围绕穿过屏幕的轴的旋转,我假设它是 Unity Space 中的 Z 轴。我尝试使用 Input.gyro.attitude.eulerAngles.z 但是当围绕其他轴倾斜设备时它不会保持不变,我希望它保持不变以便只有“Z 轴”例如,确定汽车方向盘的旋转。我该如何实现?

编辑:我尝试做其他事情。我使用了 Input.gyro.rotationRateUnbiased 而不是 Input.gyro.attitude.eulerAngles

代码如下:

    Vector3 gInput = Input.gyro.rotationRateUnbiased;
gyroEuler += gInput * Time.deltaTime * Mathf.Rad2Deg;

float rollAngle = gyroEuler.z;

while (rollAngle < 0)
{
rollAngle += 360;
}
while (rollAngle > 360)
{
rollAngle -= 360;
}

但是 gyroEuler 将设置为 (0, 0, 0) 而不管游戏开始时的设备方向如何,因此在游戏开始时设备方向是未知的开头和 Input.gyro.rotationRateUnbiased 都非常不准确。我想像许多游戏一样旋转屏幕,例如 Temple Run 2,但我希望能够将其旋转 360 度并获得该旋转角度。

最佳答案

好吧,我刚刚试过了,效果很好:

private void Start()
{
Input.gyro.enabled = true;
}

private void Update()
{
Vector3 previousEulerAngles = transform.eulerAngles;
Vector3 gyroInput = -Input.gyro.rotationRateUnbiased;

Vector3 targetEulerAngles = previousEulerAngles + gyroInput * Time.deltaTime * Mathf.Rad2Deg;
targetEulerAngles.x = 0.0f; // Only this line has been added
targetEulerAngles.z = 0.0f;

transform.eulerAngles = targetEulerAngles;

//You should also be able do it in one line if you want:
//transform.eulerAngles = new Vector3(0.0f, transform.eulerAngles.y - Input.gyro.rotationRateUnbiased.y * Time.deltaTime * Mathf.Rad2Deg, 0.0f);
}

您需要做的是创建一个中央Transform(或使用您的播放器)并将您的Camera 作为它的子级。然后设置相机 z 距离、高度和角度以调整您的 View 。最后将上述脚本附加到中央的 Transform:旋转它将使您的Camera 沿着弧线移动。

编辑:如果您想使用Input.gyro.attitude,您可以按如下方式进行

private Vector3 startEulerAngles;
private Vector3 startGyroAttitudeToEuler;

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.x = 0.0f;
deltaEulerAngles.z = 0.0f;

transform.eulerAngles = startEulerAngles - deltaEulerAngles;
}

public void ResetGyro()
{
startGyroAttitudeToEuler = Input.gyro.attitude.eulerAngles;
}

编辑 2:

我想您正在寻找的是 this 之类的东西: 然后你可以检查 upVec.yupVec.x 为你的下/上和左/右轴。

首先创建一个空的 GameObject,它将用作包含陀螺仪旋转的虚拟对象,并将其设置在脚本的 phoneDummy 字段中。

public Transform phoneDummy;

private void Start()
{
Input.gyro.enabled = true;
}

private void Update()
{
Vector3 gyroEuler = Input.gyro.attitude.eulerAngles;
phoneDummy.transform.eulerAngles = new Vector3(-1.0f * gyroEuler.x, -1.0f * gyroEuler.y, gyroEuler.z);

Vector3 upVec = phoneDummy.transform.InverseTransformDirection(-1f * Vector3.forward);
}

upVec.y 将是您的pitchupVec.x 将是您的滚动轴。(检查 here 以获取轴引用)

但请记住,来自 Input.gyro 的值远非完美:如果您正在寻找更持久的值,您可能需要使用 Input.compass.magneticHeading (但当然不太精确)。

希望这对您有所帮助,

关于android - Unity - 陀螺仪 - 仅绕一个轴旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41927052/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com