— No reviews yet
0 installs
8 views
0.0% view→install
Install
$ agentstack add skill-chrisgliddon-bevy-skills-bevy-cameras ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Are you the author of Bevy Cameras? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claimAbout
Bevy 0.18 — Cameras
When to use this skill
- Spawning the main game camera.
- Rendering to a texture (mini-map, portal, post-process target).
- Wanting a drop-in free-look or pan controller without writing your own.
- Configuring multiple cameras with different
orderfor overlays. - Setting ambient brightness on a per-camera basis (new in 0.18).
Canonical pattern
FreeCamera/PanCamera are gated behind Cargo features. In Cargo.toml:
bevy = { version = "0.18", features = ["free_camera", "pan_camera"] }
use bevy::asset::RenderAssetUsages;
use bevy::camera::RenderTarget;
use bevy::camera_controller::free_camera::{FreeCamera, FreeCameraPlugin};
use bevy::prelude::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_plugins(FreeCameraPlugin) // adds the input wiring
.add_systems(Startup, setup)
.run();
}
fn setup(mut commands: Commands, mut images: ResMut>) {
// 1. Main camera with the built-in free-look controller.
commands.spawn((
Camera3d::default(),
FreeCamera::default(),
Transform::from_xyz(0.0, 4.0, 8.0).looking_at(Vec3::ZERO, Vec3::Y),
));
// 2. A texture target for an off-screen render pass (mini-map, portal).
let size = bevy::render::render_resource::Extent3d {
width: 512,
height: 512,
depth_or_array_layers: 1,
};
let mut image = Image::new_fill(
size,
bevy::render::render_resource::TextureDimension::D2,
&[0; 4],
bevy::render::render_resource::TextureFormat::Bgra8UnormSrgb,
RenderAssetUsages::default(),
);
image.texture_descriptor.usage =
bevy::render::render_resource::TextureUsages::TEXTURE_BINDING
| bevy::render::render_resource::TextureUsages::COPY_DST
| bevy::render::render_resource::TextureUsages::RENDER_ATTACHMENT;
let image_handle = images.add(image);
// 3. A second camera that draws into the texture.
// RenderTarget is now a *separate* component, not Camera.target.
commands.spawn((
Camera3d::default(),
Camera { order: -1, ..default() }, // -1 = render before the main camera
RenderTarget::Image(image_handle.into()),
Transform::from_xyz(10.0, 5.0, 0.0).looking_at(Vec3::ZERO, Vec3::Y),
));
}
Choosing a projection
use bevy::prelude::*;
use bevy::camera::Projection;
# fn _proj(mut commands: Commands) {
// Default perspective (90° FOV is the Bevy default).
commands.spawn((Camera3d::default(), Projection::default()));
// Orthographic for top-down or strategy views.
commands.spawn((
Camera3d::default(),
Projection::Orthographic(OrthographicProjection {
scale: 10.0,
..OrthographicProjection::default_3d()
}),
));
# }
Ambient light: world default vs per-camera
use bevy::prelude::*;
use bevy::light::GlobalAmbientLight;
# fn _amb(app: &mut App, mut commands: Commands) {
// World default — applies everywhere unless a camera overrides.
app.insert_resource(GlobalAmbientLight {
brightness: 200.0,
..default()
});
// Per-camera override (new in 0.18 — `AmbientLight` is now a Component).
commands.spawn((Camera3d::default(), AmbientLight { brightness: 1000.0, ..default() }));
# }
Gotchas (0.18)
RenderTargetis a separate component.Camera { target: RenderTarget::Image(...) }is gone — wrong shape in 0.18. Spawn it alongsideCamera3d/Camera.AmbientLightis no longer aResource. It's a per-camera component. The world default lives in theGlobalAmbientLightresource.ImageRenderTarget::scale_factorisf32(used to be wrapped inFloatOrd).- Camera
orderis signed. Lower values render first. Useorder: -1for off-screen passes you'll sample in the main pass. FreeCamera/PanCameraneed their plugin AND their Cargo feature. They're feature-gated in 0.18: addfeatures = ["free_camera", "pan_camera"]to thebevydep. Spawning the component withoutFreeCameraPlugin/PanCameraPlugindoes nothing — the input systems live in the plugin.- Imports:
bevy::camera::RenderTarget,bevy::camera_controller::{free_camera::*, pan_camera::*},bevy::light::GlobalAmbientLight. None are in the prelude.
See also
bevy-pbr-materials— what cameras render through.bevy-migration-0-17-to-0-18— fullCamera.targetandAmbientLightrename.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: chrisgliddon
- Source: chrisgliddon/bevy-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.