Cdu*_*320 4 android quaternions unity-game-engine gyroscope
我正在使用 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;
}
Run Code Online (Sandbox Code Playgroud)
但在游戏开始时gyroEuler将被设置为无论设备方向如何,因此设备方向在开始时不会被知道,而且也非常不准确。我想像《Temple Run 2》等许多游戏那样旋转屏幕,但我希望能够将其旋转 360 度并获得该旋转角度。(0, 0, 0)Input.gyro.rotationRateUnbiased
嗯,我刚刚尝试过,效果很好:
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);
}
Run Code Online (Sandbox Code Playgroud)
您需要做的是创建一个中央变换(或使用您的播放器)并将您的相机作为其子级。然后设置相机z 距离、高度和角度来调整您的视图。最后将上面的脚本附加到中央变换:旋转它将使你的相机沿着弧线移动。
编辑:如果您想使用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;
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
我想您正在寻找的是这样的:然后您可以检查upVec.y和upVec.x的下/上和左/右轴。
首先创建一个空的游戏对象,它将用作包含陀螺仪旋转的虚拟对象,并将其设置在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);
}
Run Code Online (Sandbox Code Playgroud)
upVec.y将是你的俯仰轴,并将upVec.x是你的横滚轴。(在此处查看轴参考)
但请记住,值远非完美无缺:如果您正在寻找更持久的值(但当然不太精确),Input.gyro您可能需要使用。Input.compass.magneticHeading
希望这可以帮助,
| 归档时间: |
|
| 查看次数: |
14955 次 |
| 最近记录: |