6

使用Res<Events<CursorMoved>>我可以获得屏幕空间坐标中的鼠标位置变化(左下角为零),例如

#[derive(Default)]
struct State {
    cursor_moved_reader: EventReader<CursorMoved>,
}

fn set_mouse_pos(mut state: ResMut<State>, cursor_moved: Res<Events<CursorMoved>>) {
    for event in state.cursor_moved_reader.iter(&cursor_moved) {
        println!("cursor: {:?}", event.position);
    }
}

现在的问题是,当使用来自sprite的相机时,如果我将SpriteComponents'设置为光标位置,并且位置呈现在屏幕的中心。在屏幕空间鼠标坐标和相机世界空间坐标之间转换的惯用方式是什么?transform.translationCamera2dComponents::default()0, 0

4

2 回答 2

2

先前的答案似乎在正确的轨道上,但是转换并未完全实施并且实际上是过度设计的。偶然发现了同样的问题,并认为这就是相机变换的用途!这对我有用:

fn window_to_world(
    position: Vec2,
    window: &Window,
    camera: &Transform,
) -> Vec3 {

    // Center in screen space
    let norm = Vec3::new(
        position.x - window.width() / 2.,
        position.y - window.height() / 2.,
        0.,
    );

    // Apply camera transform
    *camera * norm

    // Alternatively:
    //camera.mul_vec3(norm)
}
于 2021-01-08T17:29:33.327 回答
0

当我第一次开始使用bevy. 这是我目前用来从窗口转换到世界坐标的内容(对于 2D 游戏):

fn window_to_world(
    window: &Window,
    camera: &Transform,
    position: &Vec2,
) -> Vec3 {
    let center = camera.translation.truncate();
    let half_width = (window.width() / 2.0) * camera.scale.x;
    let half_height = (window.height() / 2.0) * camera.scale.y;
    let left = center.x - half_width;
    let bottom = center.y - half_height;
    Vec3::new(
        left + position.x * camera.scale.x,
        bottom + position.y * camera.scale.y,
        0.0,  // I'm working in 2D
    )
}

bevy中,Window坐标系的原点(0, 0)位于左下角,以像素为单位,并随着您向上移动屏幕而增加。的Camera坐标默认(0, 0)位于窗口的中心,以对您的游戏最有意义的任何单位进行测量。

此功能受到限制,因为它不考虑相机的旋转,只考虑比例。

于 2020-12-24T11:45:36.583 回答