There are some ways to make a light going around an object.
We use diffuse_transmission in StandardMaterial. This field makes a light transmitted to the back of the object, which results in the backside of the object brighter.
commands.spawn(PbrBundle {
material: materials.add(StandardMaterial {
diffuse_transmission: 1.,
..default()
}),
..default()
});
The value of diffuse_transmission is between 0
and 1
.
The larger the value, the more it transmits a light to the back of the object.
Note that this field does not make the object transparent.
In the following example, we create three spheres.
From the left to right, their diffuse_transmission are 0
, 0.5
and 1
respectively.
The full code is as follows:
use bevy::{
app::{App, Startup},
asset::Assets,
core_pipeline::core_3d::Camera3dBundle,
ecs::system::{Commands, ResMut},
math::Vec3,
pbr::{DirectionalLight, DirectionalLightBundle, PbrBundle, StandardMaterial},
render::mesh::{
shape::{Plane, UVSphere},
Mesh,
},
transform::components::Transform,
utils::default,
DefaultPlugins,
};
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.run();
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands.spawn(Camera3dBundle {
transform: Transform::from_xyz(0., 2., 3.).looking_at(Vec3::new(0., 0.5, 0.), Vec3::Y),
..default()
});
// left
commands.spawn(PbrBundle {
mesh: meshes.add(
UVSphere {
radius: 0.5,
..default()
}
.into(),
),
material: materials.add(StandardMaterial {
diffuse_transmission: 0.,
..default()
}),
transform: Transform::from_xyz(-1.25, 0.5, 0.),
..default()
});
// middle
commands.spawn(PbrBundle {
mesh: meshes.add(
UVSphere {
radius: 0.5,
..default()
}
.into(),
),
material: materials.add(StandardMaterial {
diffuse_transmission: 0.5,
..default()
}),
transform: Transform::from_xyz(0., 0.5, 0.),
..default()
});
// right
commands.spawn(PbrBundle {
mesh: meshes.add(
UVSphere {
radius: 0.5,
..default()
}
.into(),
),
material: materials.add(StandardMaterial {
diffuse_transmission: 1.,
..default()
}),
transform: Transform::from_xyz(1.25, 0.5, 0.),
..default()
});
commands.spawn(PbrBundle {
mesh: meshes.add(Plane::from_size(5.).into()).into(),
material: materials.add(StandardMaterial::default()).into(),
..default()
});
commands.spawn(DirectionalLightBundle {
directional_light: DirectionalLight {
illuminance: 20000.,
shadows_enabled: true,
..default()
},
transform: Transform::default().looking_to(Vec3::new(-1., -1., -1.), Vec3::Y),
..default()
});
}
Result:
➡️ Next: Specular Transmission
📘 Back: Table of contents