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

时间:2021-01-23 21:08:33

标签: rust 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,
    );

2 个答案:

答案 0 :(得分:4)

那是 changed in Bevy 0.3 和“从 Mat4 中移出变换数据”(PR #596

这发生了变化,因此 Transform 不再具有 value: Mat4 字段,而是具有 translation: Vec3rotation: Quatscale: 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() 和/或直接分配给 transform.translationtransform.rotation 可能更直接。

答案 1 :(得分:1)

感谢@Sleepyhead on 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

相关问题