如何在Bevy中旋转和移动物体

4

我想通过给定的量来旋转我的物体并向前平移以创建一个可操控的坦克。

我找不到如何做到这一点,所有的矩阵、向量和四元数都让我很难找到解决方案。

这是我想要实现的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个回答

4

这是在 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
我在Discord上得到了@Sleepyhead的帮助,找到了答案。这个答案与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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接