Compare commits
3 Commits
2a874b8a1a
...
d85007d284
| Author | SHA1 | Date | |
|---|---|---|---|
| d85007d284 | |||
| e9bd74ddaa | |||
| 380f381274 |
@@ -2,7 +2,8 @@ class_name OverworldCamera extends Camera3D
|
|||||||
|
|
||||||
enum CameraMode { FREE, CENTERED }
|
enum CameraMode { FREE, CENTERED }
|
||||||
|
|
||||||
const COLLISION_MARGIN:float = 0.3
|
# const COLLISION_MARGIN:float = 0.1
|
||||||
|
const COLLISION_MARGIN:float = 0
|
||||||
|
|
||||||
@export_category("Target")
|
@export_category("Target")
|
||||||
@export var targetNode:Node3D = null
|
@export var targetNode:Node3D = null
|
||||||
@@ -10,7 +11,7 @@ const COLLISION_MARGIN:float = 0.3
|
|||||||
|
|
||||||
@export_category("Orbit")
|
@export_category("Orbit")
|
||||||
@export var distance:float = 7.0
|
@export var distance:float = 7.0
|
||||||
@export var minDistance:float = 2.0
|
@export var minDistance:float = 2.5
|
||||||
@export var orbitSensitivity:float = 144.0
|
@export var orbitSensitivity:float = 144.0
|
||||||
@export var orbitAcceleration:float = 600.0
|
@export var orbitAcceleration:float = 600.0
|
||||||
@export var orbitFriction:float = 10.0
|
@export var orbitFriction:float = 10.0
|
||||||
@@ -21,9 +22,11 @@ const COLLISION_MARGIN:float = 0.3
|
|||||||
@export var mouseSensitivity:float = 0.3
|
@export var mouseSensitivity:float = 0.3
|
||||||
|
|
||||||
@export_category("Auto-center")
|
@export_category("Auto-center")
|
||||||
@export var centeredDelay:float = 2.0
|
@export var centeredDelay:float = 1.0
|
||||||
@export var centeredFollowRate:float = 0.75
|
@export var centeredFollowRate:float = 0.75
|
||||||
@export var centeredMaxFollowRate:float = 1.0
|
@export var centeredMaxFollowRate:float = 1.5
|
||||||
|
@export var centeredAcceleration:float = 360.0
|
||||||
|
@export var centeredMaxYawDiff:float = 120.0
|
||||||
@export var centeredPitch:float = 30.0
|
@export var centeredPitch:float = 30.0
|
||||||
|
|
||||||
@export_category("Collision")
|
@export_category("Collision")
|
||||||
@@ -33,6 +36,7 @@ var _mode:CameraMode = CameraMode.CENTERED
|
|||||||
var _yaw:float = 0.0
|
var _yaw:float = 0.0
|
||||||
var _pitch:float = 30.0
|
var _pitch:float = 30.0
|
||||||
var _camVelocity:Vector2 = Vector2.ZERO
|
var _camVelocity:Vector2 = Vector2.ZERO
|
||||||
|
var _centerVelocity:float = 0.0
|
||||||
var _freeTimer:float = 0.0
|
var _freeTimer:float = 0.0
|
||||||
var _mouseDelta:Vector2 = Vector2.ZERO
|
var _mouseDelta:Vector2 = Vector2.ZERO
|
||||||
var _rightMouseHeld:bool = false
|
var _rightMouseHeld:bool = false
|
||||||
@@ -95,21 +99,26 @@ func _process(delta:float) -> void:
|
|||||||
else:
|
else:
|
||||||
_freeTimer = 0.0
|
_freeTimer = 0.0
|
||||||
|
|
||||||
# In CENTERED mode, smoothly slerp toward behind the player while they move;
|
# In CENTERED mode, accelerate a yaw velocity toward behind the player (using
|
||||||
# rate scales up with angular distance so large offsets catch up quickly.
|
# actual movement velocity for direction) then friction-decay when idle —
|
||||||
|
# mirrors how controller input works so there's no sudden stop.
|
||||||
if _mode == CameraMode.CENTERED:
|
if _mode == CameraMode.CENTERED:
|
||||||
var centerBody := targetNode as CharacterBody3D
|
var centerBody := targetNode as CharacterBody3D
|
||||||
if centerBody != null and centerBody.velocity.length_squared() > 0.1:
|
var vel3d:Vector3 = Vector3.ZERO if centerBody == null else centerBody.velocity
|
||||||
var behindYaw:float = rad_to_deg(atan2(
|
if vel3d.length_squared() > 0.1:
|
||||||
targetNode.global_transform.basis.z.x,
|
var behindYaw:float = rad_to_deg(atan2(-vel3d.x, -vel3d.z))
|
||||||
targetNode.global_transform.basis.z.z
|
|
||||||
))
|
|
||||||
var centerYawDiff:float = fposmod(behindYaw - _yaw + 180.0, 360.0) - 180.0
|
var centerYawDiff:float = fposmod(behindYaw - _yaw + 180.0, 360.0) - 180.0
|
||||||
var totalAngle:float = abs(centerYawDiff) + abs(centeredPitch - _pitch)
|
var totalAngle:float = abs(centerYawDiff) + abs(centeredPitch - _pitch)
|
||||||
var dynamicRate:float = minf(centeredFollowRate * (1.0 + totalAngle / 90.0), centeredMaxFollowRate)
|
var dynamicRate:float = minf(centeredFollowRate * (1.0 + totalAngle / 90.0), centeredMaxFollowRate)
|
||||||
var t:float = minf(dynamicRate * delta, 1.0)
|
if abs(centerYawDiff) <= centeredMaxYawDiff:
|
||||||
_pitch = lerpf(_pitch, centeredPitch, t)
|
_centerVelocity = move_toward(_centerVelocity, centerYawDiff * dynamicRate, centeredAcceleration * delta)
|
||||||
_yaw += centerYawDiff * t
|
var tPitch:float = minf(dynamicRate * 3.0 * delta, 1.0)
|
||||||
|
_pitch = lerpf(_pitch, centeredPitch, tPitch)
|
||||||
|
else:
|
||||||
|
_centerVelocity = lerpf(_centerVelocity, 0.0, minf(orbitFriction * delta, 1.0))
|
||||||
|
else:
|
||||||
|
_centerVelocity = lerpf(_centerVelocity, 0.0, minf(orbitFriction * delta, 1.0))
|
||||||
|
_yaw += _centerVelocity * delta
|
||||||
|
|
||||||
_pitch = clamp(_pitch, pitchMin, pitchMax)
|
_pitch = clamp(_pitch, pitchMin, pitchMax)
|
||||||
|
|
||||||
@@ -131,7 +140,7 @@ func _process(delta:float) -> void:
|
|||||||
var actualDir:Vector3 = (finalPos - pivot).normalized()
|
var actualDir:Vector3 = (finalPos - pivot).normalized()
|
||||||
var targetPitch:float = rad_to_deg(asin(clamp(actualDir.y, -1.0, 1.0)))
|
var targetPitch:float = rad_to_deg(asin(clamp(actualDir.y, -1.0, 1.0)))
|
||||||
var targetYaw:float = rad_to_deg(atan2(actualDir.x, actualDir.z))
|
var targetYaw:float = rad_to_deg(atan2(actualDir.x, actualDir.z))
|
||||||
var feedbackRate:float = minf(40.0 * delta, 1.0)
|
var feedbackRate:float = minf(120.0 * delta, 1.0)
|
||||||
_pitch = lerpf(_pitch, targetPitch, feedbackRate)
|
_pitch = lerpf(_pitch, targetPitch, feedbackRate)
|
||||||
var feedbackYawDiff:float = fposmod(targetYaw - _yaw + 180.0, 360.0) - 180.0
|
var feedbackYawDiff:float = fposmod(targetYaw - _yaw + 180.0, 360.0) - 180.0
|
||||||
_yaw += lerpf(0.0, feedbackYawDiff, feedbackRate)
|
_yaw += lerpf(0.0, feedbackYawDiff, feedbackRate)
|
||||||
|
|||||||
Reference in New Issue
Block a user