将光标转换为世界坐标
[点击这里下载完整示例代码][cbexample::cursor2worldy]
Bevy 还没有提供内置的功能来帮助找出光标当前所指向的东西。
3D 游戏
这是一个很好的(非官方)插件:
bevy_mod_picking
.
2D 游戏
下面是一个简单的取巧解决方案,用于使用默认的 Bevy 2d 摄像机正射投影的游戏:
/// Used to help identify our main camera
#[derive(Component)]
struct MainCamera;
fn setup(mut commands: Commands) {
commands.spawn()
.insert_bundle(OrthographicCameraBundle::new_2d())
.insert(MainCamera);
}
fn my_cursor_system(
// need to get window dimensions
wnds: Res<Windows>,
// query to get camera transform
q_camera: Query<&Transform, With<MainCamera>>
) {
// get the primary window
let wnd = wnds.get_primary().unwrap();
// check if the cursor is in the primary window
if let Some(pos) = wnd.cursor_position() {
// get the size of the window
let size = Vec2::new(wnd.width() as f32, wnd.height() as f32);
// the default orthographic projection is in pixels from the center;
// just undo the translation
let p = pos - size / 2.0;
// assuming there is exactly one main camera entity, so this is OK
let camera_transform = q_camera.single();
// apply the camera transform
let pos_wld = camera_transform.compute_matrix() * p.extend(0.0).extend(1.0);
eprintln!("World coords: {}/{}", pos_wld.x, pos_wld.y);
}
}