From 902888be8766b26b2d22bf89cfc5d132fbf3e305 Mon Sep 17 00:00:00 2001 From: Rob Kelly Date: Mon, 9 Dec 2024 17:04:19 -0700 Subject: [PATCH] Shot projection target is oriented to surface normal --- src/ui/3d/projectile_arc/projectile_arc.gd | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/ui/3d/projectile_arc/projectile_arc.gd b/src/ui/3d/projectile_arc/projectile_arc.gd index 2887baf..5e2ff43 100644 --- a/src/ui/3d/projectile_arc/projectile_arc.gd +++ b/src/ui/3d/projectile_arc/projectile_arc.gd @@ -73,6 +73,8 @@ func _process(_delta: float) -> void: var pos := global_position var vel := -global_basis.z * initial_speed + var final_normal: Vector3 + for t in range(0, max_steps): # TODO: smooth curve with bezier handles path.curve.add_point(pos - global_position) @@ -102,6 +104,7 @@ func _process(_delta: float) -> void: vel = PUTT_ATTRITION * (vel - 2 * norm * vel.dot(norm)) else: # End projection! + final_normal = collision["normal"] break pos = next_pos @@ -109,12 +112,20 @@ func _process(_delta: float) -> void: # Add terminal point (possibly collision point) path.curve.add_point(pos - global_position) + var child_basis := Basis.IDENTITY + if final_normal: + var up := final_normal.normalized() + var forward := Vector3(up.y, -up.x, 0) + var right := up.cross(forward).normalized() + forward = right.cross(up).normalized() + child_basis = Basis(right, up, forward) + # Reposition any children for n: Node in get_children(): if n is Node3D and n != path: var node_3d: Node3D = n node_3d.global_position = pos - node_3d.global_basis = Basis.IDENTITY + node_3d.global_basis = child_basis (%DebugDraw as CanvasItem).queue_redraw()