Third-person camera + fix the avatar customize preview
checkpoint / checkpoint (push) Successful in 1m34s
checkpoint / checkpoint (push) Successful in 1m34s
You couldn't see your own character because the camera was first-person (inside the avatar's head), and the customize screen's 3D preview rendered nothing. - player.tscn: camera now hangs off a SpringArm3D on a CameraPivot, 4 m behind + above the player, pulled in on collision. player.gd: yaw still turns the body, pitch orbits the arm (starts tilted down to frame the avatar). - avatar_customization_ui.gd: the preview SubViewport had own_world_3d=false, so it shared the Control-only main world -- no scenario, nothing rendered. Set own_world_3d=true, add a WorldEnvironment with ambient fill + a key/fill light pair, make the camera current, tweak framing. - smoke_test_player: assert the third-person SpringArm rig (18/18). - smoke_test_enter_world: wait longer for the scene change -- a real POST /join spawns a dedicated server, which is slow (9/9). Client-side change -- rebuild the exe to get it. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015jtxAiu5dAW4WxCNdGkrkJ
This commit is contained in:
@@ -165,14 +165,31 @@ func _build_ui() -> void:
|
||||
_preview_viewport.name = "PreviewViewport"
|
||||
_preview_viewport.size = Vector2i(464, 560)
|
||||
_preview_viewport.render_target_update_mode = SubViewport.UPDATE_ALWAYS
|
||||
_preview_viewport.transparent_bg = true
|
||||
# Its own 3D world -- a SubViewport that shares the (Control-only) main
|
||||
# world has no scenario/environment set up and renders nothing.
|
||||
_preview_viewport.own_world_3d = true
|
||||
_preview_container.add_child(_preview_viewport)
|
||||
|
||||
# Environment: ambient fill so the model reads even from a bad light angle.
|
||||
var world_env := WorldEnvironment.new()
|
||||
world_env.name = "PreviewEnv"
|
||||
var env := Environment.new()
|
||||
env.background_mode = Environment.BG_COLOR
|
||||
env.background_color = Color(0.10, 0.11, 0.14)
|
||||
env.ambient_light_source = Environment.AMBIENT_SOURCE_COLOR
|
||||
env.ambient_light_color = Color(0.6, 0.6, 0.65)
|
||||
env.ambient_light_energy = 1.0
|
||||
world_env.environment = env
|
||||
_preview_viewport.add_child(world_env)
|
||||
|
||||
# Camera for the preview.
|
||||
_preview_camera = Camera3D.new()
|
||||
_preview_camera.name = "PreviewCamera"
|
||||
# look_at needs a global transform, which only exists once in the tree.
|
||||
_preview_camera.look_at_from_position(
|
||||
Vector3(0, 1.0, 3.0), Vector3(0, 1.0, 0), Vector3.UP)
|
||||
Vector3(0, 1.0, 3.2), Vector3(0, 0.9, 0), Vector3.UP)
|
||||
_preview_camera.current = true
|
||||
_preview_viewport.add_child(_preview_camera)
|
||||
|
||||
# Avatar root inside the viewport.
|
||||
@@ -180,11 +197,17 @@ func _build_ui() -> void:
|
||||
_preview_root.name = "AvatarPreviewRoot"
|
||||
_preview_viewport.add_child(_preview_root)
|
||||
|
||||
# A light so the avatar is visible.
|
||||
var light := DirectionalLight3D.new()
|
||||
light.name = "PreviewLight"
|
||||
light.rotation_degrees = Vector3(-45, 30, 0)
|
||||
_preview_viewport.add_child(light)
|
||||
# Key + fill lights so the avatar is clearly visible.
|
||||
var key := DirectionalLight3D.new()
|
||||
key.name = "PreviewKeyLight"
|
||||
key.rotation_degrees = Vector3(-35, 35, 0)
|
||||
key.light_energy = 1.2
|
||||
_preview_viewport.add_child(key)
|
||||
var fill := DirectionalLight3D.new()
|
||||
fill.name = "PreviewFillLight"
|
||||
fill.rotation_degrees = Vector3(-20, -140, 0)
|
||||
fill.light_energy = 0.4
|
||||
_preview_viewport.add_child(fill)
|
||||
|
||||
# --- Right: controls ---
|
||||
var controls_panel := PanelContainer.new()
|
||||
|
||||
Reference in New Issue
Block a user