1

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

我不知道该怎么做,所有的矩阵、向量和四元数让我很难找到解决方案。

这是我想做的 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,
    );
4

2 回答 2

4

在 Bevy 0.3中通过“将变换数据移出 Mat4”(PR #596)进行了更改

这改变了,所以不是Transform有一个value: Mat4字段,而是有translation: Vec3,rotation: 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.translationand可能更直接transform.rotation

于 2021-01-23T21:32:10.560 回答
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

于 2021-01-23T21:32:02.097 回答