review: put the character on the floor, split the cubes, commit the shots
The review floor was a 5 cm slab centred 50 cm down, so the character floated 1.8 m above it. The floor is now 90 m x 90 m x 10 cm with its top face at Z 0 and the character measures Z 0..83 cm - feet on the plane. Two cubes only: A on the ground as the contact/scale reference, B held at 2 m so its cast shadow separates from the body for comparison. The scale-cubes camera was still aimed at the old three-cube row and now looks at both from the south. Screenshots are committed per the owner's instruction, and .gitignore no longer excludes them.
This commit is contained in:
1 parent
3be37c76a2
commit
0383eabc8e
11 files changed
+75
-23
No files matched your search
@@ -57,7 +57,3 @@ Thumbs.db
|
||||
|
||||
# Unreal per-project build artefacts (FileOpenOrder logs and the like)
|
||||
Build/
|
||||
|
||||
# Screenshots: only the review README is tracked; PNGs stay on disk
|
||||
/Screenshots/
|
||||
!/Screenshots/README.md
|
||||
Binary file not shown.
@@ -98,10 +98,10 @@ Scope: facts and traps that cost time to establish. Planned work lives in [ROADM
|
||||
|
||||
## 2026-11-07 — Hero facade build and review cameras
|
||||
|
||||
- **The review floor is the only ground in the scene, and it is small.** Cameras 25 m from the building line look past its edge and see the black horizon band under the facade. Place facade cameras so both the facade and enough floor are in frame, or extend the floor.
|
||||
- **The review floor was 5 cm thick and centred at Z -50 cm**, so anything placed at Z 0 floated ~1.8 m. It is now a 90 m x 90 m x 10 cm slab with its top face at Z 0; a character's bounds should read Z 0..83 cm when it stands on it. **The review floor is the only ground in the scene.** Cameras 25 m from the building line look past its edge and see the black horizon band under the facade. Place facade cameras so both the facade and enough floor are in frame, or extend the floor.
|
||||
- **The facade's frontage faces Unreal -Y.** The FBX preset maps Blender +Y (north) to Unreal -Y, so the elevation looks at negative Y and a straight-on camera must stand at **Y < -1450 cm**. A camera at positive Y looks at the back wall; cameras inside Y -1443..+250 are inside the building and render flat blue.
|
||||
- **The imported mesh is centre-origin in X but not in Y or Z.** Bounds are `x -1302..1302, y -7..1250, z 0..1450` cm, so to put the front plane on the building line the actor goes at `Y = line + 7 cm`, and `X = east edge + half width`.
|
||||
- **`save_map` returns False, without an error, when the packed `.umap` is read-only.** The review map silently keeps its old camera list. `chmod u+w` the file before rebuilding; a `umap` that keeps rendering four shots after a sixth was added is this, not a caching problem.
|
||||
- **`StaticMaterial` is a struct**: `material.get_editor_property("material_interface")`, no `get_name()` on the wrapper.
|
||||
- **Screenshot PNGs must stay out of git.** They were committed once despite the AGENTS rule; `.gitignore` now carries `/Screenshots/` with a `!/Screenshots/README.md` exception.
|
||||
- **Review screenshots are committed on the owner's instruction (2026-11-07).** They are large PNGs, so a review run adds weight to the repo; keep the shot list short and delete retired shots rather than accumulating.
|
||||
|
||||
+21
-5
@@ -1,11 +1,9 @@
|
||||
# Screenshots — visual review
|
||||
|
||||
Rendered in-game captures of the current project content, generated by
|
||||
[`Tools/render_screenshots.sh`](../Tools/render_screenshots.sh). **The PNGs in
|
||||
this folder are never committed** (`.gitignore` excludes everything here
|
||||
except this README) — they exist on disk so a human can review the game's
|
||||
appearance after every change that could affect it. The `![...]` embeds below
|
||||
resolve locally next to this file.
|
||||
[`Tools/render_screenshots.sh`](../Tools/render_screenshots.sh). The PNGs are
|
||||
committed alongside this README so a reviewer sees exactly what the build
|
||||
rendered. The `![...]` embeds below resolve next to this file.
|
||||
|
||||
## How to regenerate
|
||||
|
||||
@@ -97,6 +95,24 @@ floor at Z 0 but is 25 m away from the original review scene, so it appears to
|
||||
float over the horizon band. That is the review scene's limitation, not the
|
||||
asset's; the real map will have the terrain under it.
|
||||
|
||||
## Scene corrections in this pass (2026-11-07)
|
||||
|
||||
Three things were wrong in the staging and are fixed:
|
||||
|
||||
- **The floor was 5 cm thick and centred at Z −50 cm, so the character floated
|
||||
about 1.8 m above it.** The floor is now 90 m x 90 m x 10 cm with its top face
|
||||
exactly at Z 0, and the character stands on it: measured bounds are Z 0..83 cm
|
||||
— feet on the plane, no gap.
|
||||
- **Cubes: one on the ground, one floating.** `Cube_ScaleTest_A` sits on the floor
|
||||
(base at Z 0) as the ground-contact and scale reference; `Cube_ScaleTest_B`
|
||||
hangs at 2 m so its cast shadow separates from the object and can be compared
|
||||
against the grounded cube's contact shadow.
|
||||
- **The scale-cubes camera was still pointing at the old three-cube row.** It now
|
||||
looks at both cubes from the south at (0, −900, 200) cm.
|
||||
|
||||
Known scene limitation, unchanged: the floor is 90 m across and the horizon is a
|
||||
black band where no geometry exists. That is the review scene, not the asset.
|
||||
|
||||
## What to look for
|
||||
|
||||
- **Character**: proportions, bind pose, skin material readability.
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -59,8 +59,10 @@ try:
|
||||
|
||||
floor_mesh = unreal.EditorAssetLibrary.load_asset("/Game/Test/ScaleTest/ScaleTest_A")
|
||||
if floor_mesh and floor_mat:
|
||||
floor = spawn(unreal.StaticMeshActor, unreal.Vector(450, 450, -50.0), "ReviewFloor",
|
||||
scale=(45.0, 45.0, 0.1))
|
||||
# 1 m reference cube scaled to 90 m x 90 m x 0.1 m, top face at Z 0. The
|
||||
# scale is applied on the actor, so Z is -5 cm (+/- 5 cm around centre).
|
||||
floor = spawn(unreal.StaticMeshActor, unreal.Vector(0, 450, -5.0), "ReviewFloor",
|
||||
scale=(90.0, 90.0, 0.1))
|
||||
if floor:
|
||||
floor.static_mesh_component.set_static_mesh(floor_mesh)
|
||||
floor.static_mesh_component.set_material(0, floor_mat)
|
||||
@@ -81,18 +83,38 @@ try:
|
||||
ch = spawn(unreal.SkeletalMeshActor, unreal.Vector(0, 0, 0), "ReviewCharacter",
|
||||
rot=unreal.Rotator(pitch=0.0, yaw=180.0, roll=0.0))
|
||||
if ch:
|
||||
ch.skeletal_mesh_component.set_skinned_asset_and_update(char_mesh)
|
||||
comp = ch.skeletal_mesh_component
|
||||
comp.set_skinned_asset_and_update(char_mesh)
|
||||
# Root at the soles, not the world origin: the composes put feet on the
|
||||
# floor's top face (Z = 0). If the skeletal root is not at the soles the
|
||||
# character would float or sink, so report the bounds for the review.
|
||||
if hasattr(ch, "set_actor_location"):
|
||||
ch.set_actor_location(unreal.Vector(0, 0, 0), False, False)
|
||||
mn, mx = (None, None)
|
||||
try:
|
||||
_origin, _box = ch.get_actor_bounds(False)
|
||||
log(f"staged: MPFB character at origin, bounds z {_box.z:.1f} cm")
|
||||
except Exception as exc: # noqa: BLE001
|
||||
log(f"character bounds unavailable: {exc!r}")
|
||||
log("staged: MPFB character at origin, facing -Y")
|
||||
else:
|
||||
log("MISSING: /Game/Test/Character/character")
|
||||
|
||||
for name, x in (("ScaleTest_A", -400.0), ("ScaleTest_B", 0.0), ("ScaleTest_C", 400.0)):
|
||||
# Two cubes only, on purpose: one resting on the floor gives the ground-contact
|
||||
# and scale reference, one held at 2 m gives a clean cast shadow to compare
|
||||
# against. Their positions are chosen so both are in the overview frame and
|
||||
# neither overlaps the character.
|
||||
cube_specs = (
|
||||
("ScaleTest_A", -250.0, 600.0, 50.0, "on the ground: base at Z 0"),
|
||||
("ScaleTest_B", 250.0, 600.0, 250.0, "floating at 2 m: casts a separation shadow"),
|
||||
)
|
||||
for name, x, y, z, why in cube_specs:
|
||||
m = unreal.EditorAssetLibrary.load_asset(f"/Game/Test/ScaleTest/{name}")
|
||||
if m:
|
||||
c = spawn(unreal.StaticMeshActor, unreal.Vector(x, 600.0, 50.0), f"Cube_{name}")
|
||||
c = spawn(unreal.StaticMeshActor, unreal.Vector(x, y, z), f"Cube_{name}")
|
||||
if c:
|
||||
c.static_mesh_component.set_static_mesh(m)
|
||||
log(f"staged: {name} at ({x}, 600, 50)")
|
||||
log(f"staged: {name} at ({x}, {y}, {z}) - {why}")
|
||||
|
||||
# Hero facade, if the import has run: two views a reviewer needs — straight on
|
||||
# from the north sidewalk, and the oblique street view from further west.
|
||||
@@ -114,9 +136,9 @@ try:
|
||||
shots = spawn(unreal.GigLineShotActor, unreal.Vector(0, 0, 300), "ShotSequencer")
|
||||
if shots:
|
||||
shots.set_editor_property("shot_locations", [
|
||||
unreal.Vector(900, -1100, 500),
|
||||
unreal.Vector(700, -900, 620),
|
||||
unreal.Vector(200, -300, 160),
|
||||
unreal.Vector(200, 100, 200),
|
||||
unreal.Vector(0, -900, 200),
|
||||
# first-person eye height, just south-east of the character: this is the
|
||||
# view a player has at spawn, capsule and camera stack in frame
|
||||
unreal.Vector(120, -260, 165),
|
||||
@@ -129,11 +151,11 @@ try:
|
||||
])
|
||||
shots.set_editor_property("shot_rotations", [
|
||||
unreal.MathLibrary.find_look_at_rotation(
|
||||
unreal.Vector(900, -1100, 500), unreal.Vector(100, 200, 80)),
|
||||
unreal.Vector(700, -900, 620), unreal.Vector(0, 300, 80)),
|
||||
unreal.MathLibrary.find_look_at_rotation(
|
||||
unreal.Vector(200, -300, 160), unreal.Vector(0, 0, 85)),
|
||||
unreal.MathLibrary.find_look_at_rotation(
|
||||
unreal.Vector(200, 100, 200), unreal.Vector(0, 600, 50)),
|
||||
unreal.Vector(0, -900, 200), unreal.Vector(0, 600, 80)),
|
||||
unreal.MathLibrary.find_look_at_rotation(
|
||||
unreal.Vector(120, -260, 165), unreal.Vector(-200, 600, 90)),
|
||||
unreal.MathLibrary.find_look_at_rotation(
|
||||
|
||||
Reference in new issue
Block a user