如何在 Bevy 中旋转矩形?

How to rotate a rectangle in Bevy?

我一直在学习 Bevy,但我不知道如何简单地旋转精灵。

这里是一个最小的例子,它说明了一个看似正确旋转的正方形但一个错误旋转的矩形,具有一个依赖项 bevy = "0.6.1"main.rs:

use bevy::prelude::*;
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_startup_system(setup)
        .run();
}
fn setup(mut commands: Commands) {
    // cameras
    commands.spawn_bundle(OrthographicCameraBundle::new_2d());
    // square
    commands.spawn_bundle(SpriteBundle {
        transform: Transform {
            translation: Vec3::from((0f32, 0f32, 0f32)),
            rotation: Quat::from_rotation_z(2f32),
            scale: Vec3::new(100f32, 100f32, 0f32),
        },
        sprite: Sprite {
            color: Color::rgb(1., 1., 1.),
            ..Default::default()
        },
        ..Default::default()
    });
    // line
    commands.spawn_bundle(SpriteBundle {
        transform: Transform {
            translation: Vec3::from((0f32, 200f32, 0f32)),
            rotation: Quat::from_rotation_z(2f32),
            scale: Vec3::new(100f32, 10f32, 0f32),
        },
        sprite: Sprite {
            color: Color::rgb(1., 1., 1.),
            ..Default::default()
        },
        ..Default::default()
    });
}

如何正确旋转矩形?

(我读过 但我看不出它如何回答我的问题)

您应该更好地描述“错误旋转的矩形”是什么意思。事实上,您的代码完全符合人们的预期。

但是我认为您描述的问题是因为您使用 Transform 沿坐标轴缩放精灵然后旋转精灵,缩放轴保持固定从而导致效果矩形在旋转时不断地以不同的比例缩放。当您将下面的 rotate_system 与您的原始代码一起使用时,您可以很容易地看到这一点。

那么如何设置精灵在其本地框架中的大小呢?如下所示,可以为此使用 custom_size,然后将 Transformscale 设置为 Vec3::new(1f32, 1f32, 1f32)

我想你想根据你的代码像这样旋转矩形:

use bevy::prelude::*;
fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_startup_system(setup)
        .add_system(rotate_system.system())
        .run();
}
#[derive(Component)]
struct RotationEntity;

fn setup(mut commands: Commands) {
    // cameras
    commands.spawn_bundle(OrthographicCameraBundle::new_2d());
    // square
    commands.spawn_bundle(SpriteBundle {
        transform: Transform {
            translation: Vec3::from((0f32, 0f32, 0f32)),
            rotation: Quat::from_rotation_z(0f32),
            scale: Vec3::new(1f32, 1f32, 1f32),
        },
        sprite: Sprite {
            color: Color::rgb(1., 1., 1.),
            custom_size: Some(Vec2::new(100f32, 100f32)),
            ..Default::default()
        },
        ..Default::default()
    }).insert(RotationEntity);
    // rectangle
    commands.spawn_bundle(SpriteBundle {
        transform: Transform {
            translation: Vec3::from((0f32, 200f32, 0f32)),
            rotation: Quat::from_rotation_z(0f32),
            scale: Vec3::new(1f32, 1f32, 1f32),
        },
        sprite: Sprite {
            color: Color::rgb(1., 0., 0.),
            custom_size: Some(Vec2::new(100f32, 10f32)),
            ..Default::default()
        },
        ..Default::default()
    }).insert(RotationEntity);
}

fn rotate_system(
    time: Res<Time>,
    mut query: Query<(
        &mut Transform,
        With<RotationEntity>
    )>,
) {
    for (mut transform, is_rotation_entity) in query.iter_mut() {
        if is_rotation_entity {
            transform.rotation = Quat::from_rotation_z(time.seconds_since_startup() as f32);
        }
    }
}

这给了你这个