Built the map-content bisect the task asked for: Tools/ue_vehicle_probe_map.py duplicates ReviewMap, optionally adds one demo mesh and the pawn, and saves it as VehicleProbe. control (no extra mesh) Z 300 -> 297 rests on the review floor + Terrain_DEM Z 300 -> 498 thrown upward So Terrain_DEM alone reproduces the fault in a map that works. Two fixes were tried: - Tools/ue_clear_simple_collision.py cleared the auto-generated convex hulls from all 76 site/street meshes - the terrain had ONE convex element over 279 m - and set them to complex-as-simple. Still rises. - The terrain component set to QueryOnly, so traces hit it and physics ignores it. Still rises. Neither changed the behaviour, so the ejection is neither the convex hull nor the collision channel. The next probe is the complex triangles themselves: give Terrain_DEM no collision at all in the probe map and see whether the pawn falls. If it falls, the triangle winding is pushing bodies out of the ground mesh - the same inverted-winding family that made the sidewalk unstandable earlier. Both tools have README rows; the pawn is parked again.
67 lines
2.5 KiB
Python
67 lines
2.5 KiB
Python
"""Remove the auto-generated simple collision from the site meshes, keeping their triangles.
|
|
|
|
<engine>/UnrealEditor-Cmd <uproject> -run=pythonscript \
|
|
-script=<repo>/Tools/ue_clear_simple_collision.py -nullrhi -unattended -nopause -stdout
|
|
|
|
Why: the FBX import runs with `auto_generate_collision`, which adds ONE convex hull per mesh. For a
|
|
279 m terrain or road that hull is a giant slab, and any *physics body* inside it - the Chaos vehicle -
|
|
is pushed out of the hull every frame. Walked characters never notice, because character movement
|
|
sweeps instead of resolving penetration, which is why the player was fine while the car was thrown
|
|
into the air.
|
|
|
|
Clearing the hulls leaves `CTF_USE_COMPLEX_AS_SIMPLE`, so traces and physics use the real triangles.
|
|
|
|
Result: /tmp/gigline/clear-simple-collision.txt
|
|
"""
|
|
|
|
import unreal
|
|
|
|
FOLDERS = ("/Game/Hollywood/Site", "/Game/Hollywood/Streets")
|
|
RESULT = "/tmp/gigline/clear-simple-collision.txt"
|
|
lines = []
|
|
|
|
|
|
def log(message):
|
|
lines.append(str(message))
|
|
unreal.log(str(message))
|
|
|
|
|
|
def main():
|
|
cleared = 0
|
|
for folder in FOLDERS:
|
|
for path in unreal.EditorAssetLibrary.list_assets(folder, recursive=False):
|
|
mesh = unreal.EditorAssetLibrary.load_asset(path)
|
|
if not isinstance(mesh, unreal.StaticMesh):
|
|
continue
|
|
body = mesh.get_editor_property("body_setup")
|
|
if body is None:
|
|
continue
|
|
agg = body.get_editor_property("agg_geom")
|
|
convex = len(agg.get_editor_property("convex_elems"))
|
|
boxes = len(agg.get_editor_property("box_elems"))
|
|
if not convex and not boxes:
|
|
continue
|
|
agg.set_editor_property("convex_elems", [])
|
|
agg.set_editor_property("box_elems", [])
|
|
body.set_editor_property("agg_geom", agg)
|
|
body.set_editor_property("collision_trace_flag",
|
|
unreal.CollisionTraceFlag.CTF_USE_COMPLEX_AS_SIMPLE)
|
|
mesh.set_editor_property("body_setup", body)
|
|
unreal.EditorAssetLibrary.save_loaded_asset(mesh)
|
|
log(f"{mesh.get_name()}: cleared {convex} convex, {boxes} box, complex-as-simple")
|
|
cleared += 1
|
|
lines.append(f"VERDICT: {'PASS' if cleared else 'NOTHING-TO-DO'}")
|
|
log(f"{cleared} meshes cleared")
|
|
|
|
|
|
try:
|
|
main()
|
|
except Exception as exc: # noqa: BLE001
|
|
import traceback
|
|
log(f"FAILED: {type(exc).__name__}: {exc}")
|
|
log(traceback.format_exc())
|
|
lines.append("VERDICT: FAIL")
|
|
|
|
with open(RESULT, "w") as f:
|
|
f.write("\n".join(lines) + "\n")
|