首页 > 其他分享 >bevy cursor to world

bevy cursor to world

时间:2023-08-02 16:34:38浏览次数:37  
标签:bevy cursor add camera let position world


代码

//! bevy version: 0.11
//! Spawn a ball on the plane when you click on it.

use bevy::prelude::*;
use bevy::input::common_conditions::input_just_pressed;
use bevy::window::{PrimaryWindow, close_on_esc};

const PLANE_SIZE: f32 = 5.0;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        .add_systems(Startup, setup)
        .add_systems(Update, close_on_esc)
        .add_systems(
            Update,
            cursor_to_world
                .run_if(input_just_pressed(MouseButton::Left)),
        )
        .run();
}

fn setup(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    // plane
    commands
        .spawn(PbrBundle {
            mesh: meshes.add(shape::Plane::from_size(PLANE_SIZE).into()),
            material: materials.add(Color::rgb(0.3, 0.5, 0.3).into()),
            ..default()
        });

    // light
    commands
        .spawn(PointLightBundle {
            point_light: PointLight {
                intensity: 1500.0,
                shadows_enabled: true,
                ..default()
            },
            transform: Transform::from_xyz(4.0, 8.0, 4.0),
            ..default()
        });

    // camera
    commands.spawn(Camera3dBundle {
        transform: Transform::from_translation(Vec3::new(2., 2., 4.))
            .looking_at(Vec3::ZERO, Vec3::Y),
        ..default()
    });
}

fn cursor_to_world(
    window: Query<&Window, With<PrimaryWindow>>,
    camera: Query<(&Camera, &GlobalTransform)>,

    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
) {
    let window = window.single();
    let Some(cursor_position) = window.cursor_position() else { return; };

    let (camera, camera_transform) = camera.single();

    let Some(ray) = camera.viewport_to_world(camera_transform, cursor_position) else { return; };

    let Some(distance) = ray.intersect_plane(Vec3::ZERO, Vec3::Y) else { return; };
    let world_position = ray.get_point(distance);

    if world_position.x.abs() > PLANE_SIZE/2. || world_position.z.abs() > PLANE_SIZE/2. { return; }

    let radius = 0.1;

    commands.spawn(PbrBundle {
        mesh: meshes.add(shape::UVSphere { radius, ..default() }.into()),
        transform: Transform::from_translation(world_position + Vec3::new(0., radius, 0.)),
        ..default()
    });
}

标签:bevy,cursor,add,camera,let,position,world
From: https://www.cnblogs.com/hangj/p/17601038.html

相关文章

  • 【汇编】汇编的helloWorld
    过程汇编源代码->编译->链接->执行exe。编译:将源码翻译成机器代码,生成目标(obj)文件。有x个源码文件就会生成x个目标文件。链接:将目标文件进行链接,生成exe文件。在dos中,shell是一直运行的进程,当执行汇编exe时,shell会将exe加载进内存,shell中断暂停运行,并设置CPU的CS:IP......
  • 最小Hello-world的实现——第一天(准备linux环境)
    wsl之配置vscode使用了wsl去进行在windows环境下运行linux服务,我之前就下载好了wsl的,所以只是欠缺从vscode中连接到linux服务器。采用了下述博文去配置vscode中的ssh服务。配置攻略最简单的就是通过通过wsl指令进入linux环境,然后直接用.code命令。......
  • Node.js入门 - 永恒的Hello World!
    文章原作者为LeeJacobson,已经作者授权翻译用于非商业用途。介绍 这是我的关于Node.js系列入门教程的第一篇。必须说明一下,我并不是Node.js的专家,但是尝试向别人解释这是怎么回事是自我学习的一个好方法。如果你发现有些地方并不是那么正确,请提出来让我知道以便修正,谢之。 最近......
  • Ruby实践—HelloWorld
    开发环境OS:WindowsXPRuby:Ruby1.9.1Rails:Rails2.3.5IDE:RubyMine2.0.1 1、创建Rails工程 2、修改/config/database.yml自动创建的工程中默认数据库连接的是sqlite,如果没有安装此数据库,需要修改该配置(本例中使用的是mysql)#MysqlVersion5.1.46development:adapter:mys......
  • c语言当中的COORD ,GetStdHandle(),SetConsoleCursorPosition(),以及避免清屏和反复刷新
    这是WindowsAPI定义的结构体类型COORD来表示字符在控制台屏幕上的坐标,结构体类型COORD定义为:typedefstruct_COORD{SHORTx;SHORTy;}COORD;使用WindowsAPI GetStdHandle()从一个特定的标准设备获取表示设备的句柄(用来标识不同设备的一个数值),SetConsoleCursor......
  • Hello, World!
    IA32AT&THelloworld#!/usr/bin/env-Sgcc-nostdlib-no-pie-ohello .section .rodata .align4.LC0: .ascii "Hello,World!\n".LC1: .long .LC1-.LC0 .text .globl _start .type _start,@function_start: movl $4,%eax movl $1,%ebx......
  • redis中的Cursor使用实例
    Redis中的Cursor使用实例Redis是一种高性能的键值存储系统,常用于缓存、消息队列和排行榜等应用场景。在Redis中,Cursor是一种用于遍历集合元素的机制。通过使用Cursor,我们可以逐步地获取集合中的元素,而不需要一次性将整个集合加载到内存中。什么是Cursor在Redis中,Cursor是一个游......
  • docker配置文件输出helloworld
    1.在root下创建dockerfilesudo-itouchDockerfilevimDockerfile2.编写helloworld.gopakagemainimport"fmt"funcmain(){fmt.Println("Hello,World!")} 3.配置DockerfileFROMubuntu:22.04ASv1ENVMYNAME="WANGYIDI"WOR......
  • Hello world
    Helloworld!编写代码publicclassHello{publicstaticvoidmain(String[]args){System.out.print("Hello,World!");}}编译javacjava文件,生成class文件运行class文件,javaclass文件......
  • CGO输出helloworld
    使用CGO输出helloworld本人windows版本goversiongo1.18.3windows/amd64dir目录:D:\cgo\mainModeLastWriteTimeLengthName---------------------------d-----2023/7/1921:59......