在 Bevy 0.4 中使用父级转换 PbrBundle

问题描述

我面临一个实体已经存在的问题,但我想向它添加一个 PbrBundle。 为了尝试解决这个问题,我试图与 PbrBundle 一起生成一个子实体。希望按照父级进行改造,但是改造的部分好像不行。

fn spawn_parent(commands: &mut Commands) -> Entity {
    let entity = commands.spawn((Transform::from_translation(vec3(1.0,0.0,0.0)),)) ...

我希望代码绘制的线不会位于屏幕中间(应该向右平移,更改父级似乎根本没有任何影响):

enter image description here

我从下面的代码中得到以下输出

Spawned camera: 0v0
Spawned parent: 1v0
Spawned child: 2v0
0v0 changed global transform: Vec3(0.0,10.0)
2v0 changed parent: Parent(1v0)
1v0 changed children: Children([2v0])
2v0 changed global transform: Vec3(0.0,0.0)

代码

use bevy::prelude::*;
use bevy::math::vec3;
use bevy::render::mesh::Indices;
use bevy::render::pipeline::Primitivetopology;

fn main() {
    App::build()
        .add_plugins(DefaultPlugins)
        .add_system(debug_global_transform.system())
        .add_system(debug_children.system())
        .add_system(debug_parent.system())
        .add_startup_system(setup.system())
        .run();
}

fn setup(commands: &mut Commands,meshes: ResMut<Assets<Mesh>>,materials: ResMut<Assets<StandardMaterial>>) {
    spawn_camera(commands);
    let parent_entity = spawn_parent(commands);
    spawn_child(commands,meshes,materials,parent_entity);
}

fn spawn_camera(commands: &mut Commands) {
    commands.spawn(Camera3dBundle {
        perspective_projection: Default::default(),transform: Transform::from_translation(Vec3::new(0.0,10.0))
            .looking_at(Vec3::zero(),Vec3::unit_y()),..Default::default()
    });
    println!("Spawned camera: {:?}",commands.current_entity().unwrap());
}

fn spawn_parent(commands: &mut Commands) -> Entity {
    let entity = commands.spawn((Transform::from_translation(vec3(1.0,)).current_entity().unwrap();
    println!("Spawned parent: {:?}",entity);
    entity
}

fn spawn_child(commands: &mut Commands,mut meshes: ResMut<Assets<Mesh>>,mut materials: ResMut<Assets<StandardMaterial>>,parent_entity: Entity) {
    let mut mesh = Mesh::new(Primitivetopology::LineList);
    mesh.set_attribute(Mesh::ATTRIBUTE_POSITION,vec![[0.0,0.0],[0.0,1.0,0.0]]);
    mesh.set_attribute(Mesh::ATTRIBUTE_norMAL,0.0]]);
    mesh.set_attribute(Mesh::ATTRIBUTE_UV_0,0.0]]);
    mesh.set_indices(Some(Indices::U32(vec![0,1])));
    let child_entity = commands.spawn(PbrBundle {
            mesh:  meshes.add(mesh),material: materials.add(Color::rgb(1.0,1.0).into()),// Default transform,let the parent decide where this is drawn
            ..Default::default()
        })
        //.with(Parent(parent_entity)) // Doesn't seem to work well either
        .current_entity()
        .unwrap();
    println!("Spawned child: {:?}",child_entity);
    commands.push_children(parent_entity,&[child_entity]);
}

fn debug_global_transform(query: Query<(Entity,&GlobalTransform),Changed<GlobalTransform>>) {
    query.iter()
        .for_each(|(entity,transform)| {
            println!("{:?} changed global transform: {:?}",entity,transform.translation);
        });
}

fn debug_children(children_query: Query<(Entity,&Children),Changed<Children>>) {
    for (entity,children) in children_query.iter() {
        println!("{:?} changed children: {:?}",children);
    }
}

fn debug_parent(parent_query: Query<(Entity,&Parent),Changed<Parent>>) {
    for (entity,parent) in parent_query.iter() {
        println!("{:?} changed parent: {:?}",parent);
    }
}

解决方法

似乎向父级添加 GlobalTransform 可以解决问题:)

RewriteRule ^(.*)$ https://localhost/yourfilename/$1 [R,L]