我想要将我的对象旋转给定的量,并将其向前平移,以创建一个可操纵的坦克。
我找不到怎么做,所有的矩阵,向量和四元数使我很难找到解决方案。
这是我想要做的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,
);发布于 2021-01-24 05:32:02
感谢@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;目前有一个关于添加更多转换方向的未决问题:https://github.com/bevyengine/bevy/issues/1298
发布于 2021-01-24 05:32:11
这是带有"Move transform data out of Mat4“(PR #596)的changed in Bevy 0.3
这种情况发生了变化,因此不再使用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可能更简单。
https://stackoverflow.com/questions/65864409
复制相似问题