【问题标题】:How to move the camera using gyro in Unity如何在 Unity 中使用陀螺仪移动相机
【发布时间】:2017-06-05 09:51:39
【问题描述】:

我有一个横向的 Unity 游戏。我希望能够向左和向右旋转相机。更多,我想根据陀螺仪在y轴的倾斜,以及左右旋转的总矢量来前后移动相机。换句话说,我希望能够像在房间里行走的人一样移动相机。相机是我游戏的主要参与者。

这是我尝试做的:

GameObject CamParent;
Rigidbody RB;

void Start()
{

    CamParent = new GameObject("CamParent");
    CamParent.transform.position = this.transform.position;
    this.transform.parent = CamParent.transform;
    Input.gyro.enabled = true;
    RB = this.GetComponent<Rigidbody>();
}

void Update()
{
    CamParent.transform.Rotate(0, -Input.gyro.rotationRateUnbiased.y, 0);
    this.transform.Rotate(-Input.gyro.rotationRateUnbiased.x, 0,0);
    float Z = -Input.gyro.userAcceleration.z;
    RB.AddForce(new Vector3(0,0,Z)*10);
}

【问题讨论】:

  • 我不确定我是否理解您想要做什么,但是将刚体添加到相机父级并添加力而不是添加直接给相机强行?否则随着相机从其原始位置移动,旋转相机父级的效果会发生变化。

标签: c# unity3d gyroscope


【解决方案1】:

我已尽力回答您的问题,因为您的问题对我来说有点不清楚。

首先,由于您使用的是力和物理,您应该使用void FixedUpdate() 函数而不是void Update() 函数。这将确保您的代码以均匀的间隔执行,这在处理物理时非常重要。

我也不确定你为什么要实例化一个新的游戏对象。您可以简单地将此脚本添加到 Unity 中的相机游戏对象,然后也将刚体组件添加到相机中。这将简化您的 Start() 函数,它应该只包含这两行:

Input.gyro.enabled = true;
RB = gameObject.GetComponent<Rigidbody>();

接下来,需要注意的是,从Input.gyro.attide 返回的四元数具有左手坐标,而 Unity 具有右手坐标。 Gyroscope 到 Unity 的转换可以通过以下函数完成:

Quaternion GyroToUnity(Quaternion quat)
{
    return new Quaternion(quat.x, quat.z, quat.y, -quat.w);
}

我确信还有其他方法可以完成这种转换,但这种方法对我有用。

现在让我们来处理相机的旋转。首先通过将相机的transform.rotation 设置为您刚刚从陀螺仪转换的四元数来设置相机的旋转。然而,还有一个问题,因为 Gyroscope z 轴与 Unity 的 y 轴指向相同的方向。这可以通过简单地执行transform.Rotate(90,0,0); 来解决。最后,我们使用这行代码来设置Camera的旋转:

transform.rotation = Quaternion.Euler(new Vector3(0f, transform.rotation.eulerAngles.y, 0f));

最后我们必须处理向相机添加力。我不确定您希望如何处理运动,但我假设您希望相对于相机的旋转绕 z 轴运动。为此,您需要使用相机上刚体组件中的AddRelativeForce(Vector3 relativeForce)

但是,要确定力的方向,我们必须从之前转换为 Unity 的四元数获取绕 x 轴的旋转度数。 yourQuat.eulerAngles.x,它返回一个 float 使得 0

Vector3 relativeForce;
if (yourQuat.eulerAngles.x > 315 || yourQuat.eulerAngles.x < 90)
    relativeForce = Vector3.forward;
else if (yourQuat.eulerAngles.x < 315)
    relativeForce = Vector3.back;
else
    relativeForce = Vector3.zero;

最后取后续的Vector3值,像这样使用

RB.AddRelativeForce(relativeForce);

希望对您有所帮助。如果这不是您正在寻找的确切功能,那么这应该让您有一个良好的开端来微调您的程序以完全满足您的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多