如何在 bevy 中旋转和移动对象

How to rotate and move object in bevy

我想将我的对象旋转给定的量并将其向前平移以创建一个可操纵的坦克。

我找不到解决方法,所有的矩阵、向量和四元数让我很难找到解决方案。

这是我想要做的 Unity 等价物:

transform.Rotate(0, 0, -turn_input * turnSpeed * Time.deltaTime);
transform.position += transform.forward * drive * speed * Time.deltaTime;

我曾经在 Bevy 0.2.1 中使用过这段代码,但在更新到 0.4 后它就崩溃了

*transform.value_mut() = *transform.value()
    * Mat4::from_rotation_translation(
        Quat::from_rotation_z(-turn_input * tank.turn_speed * time.delta_seconds),
        Vec3::unit_y() * drive * tank.speed * time.delta_seconds,
    );

感谢 @Sleepyhead 在 discord 上的帮助,我找到了答案。 它接近 Unity 代码但只有 3 行,因为您不能在同一行读取和更新。

Bevy 只有 transform.forward()(@Sleepyhead 建议)进入 Z 方向: https://docs.rs/bevy/0.4.0/bevy/prelude/struct.Transform.html#method.forward

#[inline]
pub fn forward(&self) -> Vec3 {
    self.rotation * Vec3::unit_z()
}

我修改了 Y 方向的代码 transform.rotation * Vec3::unit_y() 并在最终解决方案中使用它:

transform.rotate(Quat::from_rotation_z(-turn_input * tank.turn_speed * time.delta_seconds()));
let move_dir = transform.rotation * Vec3::unit_y() * drive * tank.speed * time.delta_seconds();
transform.translation += move_dir;

目前有一个未解决的问题,用于向 Transform 添加更多方向:https://github.com/bevyengine/bevy/issues/1298

那是 changed in Bevy 0.3 with "Move transform data out of Mat4" (PR #596)

这已更改,因此 Transform having a value: Mat4 field, then instead it would have translation: Vec3, rotation: Quat, and scale: Vec3 不再是。

如果你想要你的代码的直译,那就是:

transform = Transform::from_matrix(
    transform.compute_matrix()
        * Mat4::from_rotation_translation(
            Quat::from_rotation_z(-turn_input * tank.turn_speed * time.delta_seconds),
            Vec3::unit_y() * drive * tank.speed * time.delta_seconds,
        ),
);

但是,使用 transform.rotate() and/or assign directly to transform.translation and transform.rotation 可能更直接。