Как загрузить часть изображения в Bevy Engine

У меня есть png-файл с таблицей спрайтов, который содержит некоторые статические спрайты, такие как стены или трава. Как я могу разбить их на отдельные спрайты по их координатам на изображении?

Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы пока не публиковали код или то, что пробовали, поэтому я даю общий ответ.

Есть несколько вариантов:

  • Вы можете использовать texture2DArray в своем шейдере, как показано здесь или здесь.
  • Вы можете изменить UV-координаты вашего меша, чтобы добиться этого.

Мне лично больше нравится манипулирование координатами uv, базовый образец с bevy = 0.4 будет выглядеть так:

use bevy::prelude::*;

fn main() {
    App::build()
        .add_resource(Msaa { samples: 4 })
        .add_plugins(DefaultPlugins)
        .add_startup_system(setup.system())
        .run();
}

/// set up a simple 3D scene
fn setup(
    commands: &mut Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    asset_server: Res<AssetServer>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {

    let texture_handle = asset_server.load("textures/sprites_array.png");

    let material_handle = materials.add(StandardMaterial {
        albedo_texture: Some(texture_handle.clone()),
        shaded: false,
        ..Default::default()
    });

    let mut uvs = Vec::new();
    uvs.push([0.0, 1.0]);
    uvs.push([0.0, 0.0]);
    uvs.push([1.0, 0.0]);
    uvs.push([1.0, 1.0]);

    let mut mesh = Mesh::from(shape::Quad::new(Vec2::new(1.0, 1.0)));
    mesh.set_attribute(Mesh::ATTRIBUTE_UV_0, uvs);

    // use only the upper left part of the texture atlas
    let mut uvs1 = Vec::new();
    uvs1.push([0.0, 0.5]);
    uvs1.push([0.0, 0.0]);
    uvs1.push([0.5, 0.0]);
    uvs1.push([0.5, 0.5]);

    let mut mesh1 = Mesh::from(shape::Quad::new(Vec2::new(1.0, 1.0)));
    mesh1.set_attribute(Mesh::ATTRIBUTE_UV_0, uvs1);

    // use only the lower right part of the texture atlas
    let mut uvs2 = Vec::new();
    uvs2.push([0.5, 1.0]);
    uvs2.push([0.5, 0.5]);
    uvs2.push([1.0, 0.5]);
    uvs2.push([1.0, 1.0]);

    let mut mesh2 = Mesh::from(shape::Quad::new(Vec2::new(1.0, 1.0)));
    mesh2.set_attribute(Mesh::ATTRIBUTE_UV_0, uvs2);

    // add entities to the world
    commands
        // the whole texture array
        .spawn(PbrBundle {
            mesh: meshes.add(mesh),
            material: material_handle.clone(),
            ..Default::default()
        })
        // only the "first" item of the texture array
        .spawn(PbrBundle {
            mesh: meshes.add(mesh1),
            material: material_handle.clone(),
            transform: Transform::from_translation(Vec3::new(2.0, 0.0, 0.0)),
            ..Default::default()
        })
        // only the "last" item of the texture array
        .spawn(PbrBundle {
            mesh: meshes.add(mesh2),
            material: material_handle.clone(),
            transform: Transform::from_translation(Vec3::new(-2.0, 0.0, 0.0)),
            ..Default::default()
        })
        // light
        .spawn(LightBundle {
            transform: Transform::from_translation(Vec3::new(4.0, 8.0, 4.0)),
            ..Default::default()
        })
        // camera
        .spawn(Camera3dBundle {
            transform: Transform::from_translation(Vec3::new(0.0, 0.0, 5.0))
                .looking_at(Vec3::default(), Vec3::unit_y()),
            ..Default::default()
        });
}

Я использовал этот массив текстур (поместил в assets/textures/sprites_array.png): Texture

Что затем приведет к этой сцене: The bevy scene.

Спасибо за Ваш ответ. Это именно то, что я хочу!

starcy 30.03.2021 15:26

Другие вопросы по теме