🐦

【Bevy0.13】マウスカーソルのワールド座標の取得(2D)

2024/03/09に公開

概要

ウィンドウ上のマウスカーソルのワールド座標をコンソールに出力するプログラムです。
bevyのWindowコンポーネントはウィンドウ上のマウスカーソルの座標を取得するcursor_position()を持っています。それを使えばマウス座標を取得できるのですが、ワールド座標ではなく左上を原点としたウィンドウ座標を返します。
今回はワールド座標を取得したいのでCameraコンポーネントの持つviewport_to_world_2d()を使いウィンドウ座標をワールド座標に変換します。

ソースコード

use bevy::{prelude::*, window::PrimaryWindow};

fn main(){
   App::new()
      .add_plugins(DefaultPlugins)
      .add_systems(Startup, setup)
      .add_systems(Update, print_mouse_position)
      .run();
}

fn setup(mut commands : Commands){
   commands.spawn(Camera2dBundle::default());
}

fn print_mouse_position(
   q_window : Query<&Window, With<PrimaryWindow>>,
   q_camera : Query<(&Camera,&GlobalTransform)>,
){
   let window = q_window.single();
   let (camera, camera_transform) = q_camera.single();
   let op_world_cursor_position = window.cursor_position()
      .and_then(|viewport_position|{
         camera.viewport_to_world_2d(camera_transform, viewport_position)
      });

   if let Some(world_cursor_position) = op_world_cursor_position{
      println!("{}",world_cursor_position);
   }
}

Discussion