问题描述
我想将对象旋转给定的量并将其向前平移以创建一个可操纵的坦克。
我不知道怎么做,所有的矩阵、向量和四元数都让我很难找到解决方案。
这是我想做的 Unity 等价物:
transform.Rotate(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,);
解决方法
那是 changed in Bevy 0.3 和“从 Mat4 中移出变换数据”(PR #596)
这发生了变化,因此 Transform
不再具有 value: Mat4
字段,而是具有 translation: Vec3
、rotation: Quat
和 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()
和/或直接分配给 transform.translation
和 transform.rotation
可能更直接。
感谢@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