lighting: fixed daytime rig, real surface materials, dynamic lights
Completes "Fixed daytime lighting and basic ambience" for 0.1.0. All 14 screenshots approved by the owner. Lighting rig (Tools/ue_build_demo_map.py): - Sun pitch -50 / yaw 120, intensity 4, warm (255/245/230), atmosphere sun light - Sky light 2.6 with real-time capture, sky atmosphere, height fog (density 0.008) - Unbound post-process volume with fixed exposure (min == max brightness) so a shot cannot wash out or crush to black depending on how much sky it frames - Dynamic-only: r.AllowStaticLighting=False plus MOVABLE lights and mesh components, so the editor's "LIGHTING NEEDS TO BE REBUILT" warning no longer fires and nothing needs baking Bugs found and fixed on the way: - Blender diffuse colours do not survive the FBX -> Unreal import: every site material arrived white and the terrain arrived with WorldGridMaterial, which is what actually made the scene look blown out. The demo builder now creates and assigns M_Asphalt, M_Concrete, M_Ground and M_RoadPaint. - Only one of the three crossings reached the game: each zebra band was its own object, so Blender renamed the duplicates .001/.002 and exact-name site assembly skipped them. All bands are now one Crossing_Markings mesh. - Demo cameras: street-level sat inside the facade body (rendering its unlit back face) and the crossing camera aimed at the s=36.6 crossing instead of the designated s=130.1 (UE X -14956). - The terrain had no material and imported as a bright default grid. - Cleared a committed Android File Server SecurityToken (plugin disabled and shipping-excluded; the value must stay empty). Docs: - Screenshots/README.md: one consolidated table for all 14 shots with map, camera view and description; all approved. - MEMORY.md: records the material-import, exposure, light_color struct, band-naming, camera-bounds and lighting-build traps. - TODO.md: lighting item marked done. Squash of branch gameplay-lighting-0.1.0 (PR #3).
This commit is contained in:
1 parent
1dbe737b85
commit
accf3a5306
38 files changed
+318
-126
No files matched your search
@@ -261,20 +261,24 @@ def main():
|
||||
paint = bpy.data.materials.new("Road_Paint_White")
|
||||
paint.diffuse_color = (0.85, 0.85, 0.85, 1.0)
|
||||
|
||||
def crossing_band(s_c):
|
||||
# All three bands live in ONE object. Creating one object per crossing used
|
||||
# to produce Crossing_Markings, .001 and .002; site assembly appends by the
|
||||
# exact name, so only the first crossing ever reached the game.
|
||||
band_verts, band_faces = [], []
|
||||
|
||||
def add_crossing_band(s_c):
|
||||
# Stripes are emitted as two triangles each: the road crown makes the
|
||||
# quad non-planar and the FBX SDK refuses to triangulate it on import
|
||||
# ("unable to triangulate mesh" — the mesh is omitted entirely).
|
||||
zone = 3.0 # band length along the road, m
|
||||
w, g = 0.5, 0.5 # stripe width / gap, m
|
||||
span = (SOUTH_GUTTER + 0.2, NORTH_GUTTER - 0.2)
|
||||
verts, faces = [], []
|
||||
n = int(zone // (w + g))
|
||||
covered = n * w + (n - 1) * g # actual stripe coverage, centred on s_c
|
||||
for k in range(n):
|
||||
s0 = s_c - covered / 2 + k * (w + g)
|
||||
corners = []
|
||||
base_idx = len(verts) # verts grows only after the stripe is sampled
|
||||
base_idx = len(band_verts) # sampled positions, then vertices
|
||||
pts = []
|
||||
for s_edge in (s0, s0 + w):
|
||||
base, normal, _ = at(s_edge)
|
||||
for off in span:
|
||||
@@ -284,23 +288,23 @@ def main():
|
||||
# interpolates the DEM along 1 m rows while the markings sample
|
||||
# only their own corners, so a 1 cm lift left parts of the
|
||||
# stripes sunk under the road and invisible in game.
|
||||
corners.append((base_idx + len(corners), (x, y, (dem_z(x, y) or 0.0) + 0.06)))
|
||||
# corners order: (s0,off_s), (s0,off_n), (s1,off_s), (s1,off_n)
|
||||
idx = [c[0] for c in corners]
|
||||
verts.extend(c[1] for c in corners)
|
||||
faces.append((idx[0], idx[3], idx[1]))
|
||||
faces.append((idx[0], idx[2], idx[3]))
|
||||
mesh = bpy.data.meshes.new("Crossing_Markings")
|
||||
mesh.from_pydata(verts, [], faces)
|
||||
mesh.update()
|
||||
mesh.materials.append(paint)
|
||||
obj = bpy.data.objects.new("Crossing_Markings", mesh)
|
||||
bpy.context.scene.collection.objects.link(obj)
|
||||
return obj
|
||||
pts.append((x, y, (dem_z(x, y) or 0.0) + 0.06))
|
||||
# pts order: (s0,off_s), (s0,off_n), (s1,off_s), (s1,off_n)
|
||||
band_verts.extend(pts)
|
||||
band_faces.append((base_idx + 0, base_idx + 3, base_idx + 1))
|
||||
band_faces.append((base_idx + 0, base_idx + 2, base_idx + 3))
|
||||
|
||||
for s_c in CROSSINGS:
|
||||
band = crossing_band(s_c)
|
||||
print(f"crossing band at s={s_c:.1f}: {len(band.data.polygons)} stripes")
|
||||
add_crossing_band(s_c)
|
||||
|
||||
mesh = bpy.data.meshes.new("Crossing_Markings")
|
||||
mesh.from_pydata(band_verts, [], band_faces)
|
||||
mesh.update()
|
||||
mesh.materials.append(paint)
|
||||
markings = bpy.data.objects.new("Crossing_Markings", mesh)
|
||||
bpy.context.scene.collection.objects.link(markings)
|
||||
print(f"crossing markings: {len(CROSSINGS)} bands, "
|
||||
f"{len(markings.data.vertices)} verts, {len(markings.data.polygons)} faces")
|
||||
|
||||
for obj in (road, sw_s, sw_n):
|
||||
print(f"{obj.name:16} verts {len(obj.data.vertices):5} faces {len(obj.data.polygons):5}")
|
||||
|
||||
Reference in new issue
Block a user