54 lines
1.7 KiB
GDScript
54 lines
1.7 KiB
GDScript
class_name TableCamera
|
|
extends Camera3D
|
|
|
|
## TableCamera - Isometric camera for the game table
|
|
|
|
# Camera settings
|
|
@export var camera_distance: float = 17.0
|
|
@export var camera_angle: float = 55.0 # Degrees from horizontal (higher = more top-down)
|
|
@export var camera_height_offset: float = -4.0 # Offset to look slightly above center
|
|
|
|
# Smooth movement
|
|
@export var smooth_speed: float = 5.0
|
|
var target_position: Vector3 = Vector3.ZERO
|
|
|
|
func _ready() -> void:
|
|
_setup_isometric_view()
|
|
|
|
func _setup_isometric_view() -> void:
|
|
# Set perspective projection
|
|
projection = PROJECTION_PERSPECTIVE
|
|
fov = 50.0
|
|
|
|
# Calculate position - camera is positioned behind Player 1's side
|
|
var angle_rad = deg_to_rad(camera_angle)
|
|
|
|
# Height based on angle
|
|
var height = camera_distance * sin(angle_rad)
|
|
# Distance along Z axis (positive Z is toward Player 1)
|
|
var z_offset = camera_distance * cos(angle_rad)
|
|
|
|
# Position camera behind Player 1 (positive Z), looking toward center/opponent
|
|
position = Vector3(0, height, z_offset)
|
|
|
|
# Look at center of table
|
|
look_at(Vector3(0, camera_height_offset, 0), Vector3.UP)
|
|
|
|
target_position = position
|
|
|
|
func _process(delta: float) -> void:
|
|
# Smooth camera movement if needed
|
|
if position.distance_to(target_position) > 0.01:
|
|
position = position.lerp(target_position, smooth_speed * delta)
|
|
look_at(Vector3(0, camera_height_offset, 0), Vector3.UP)
|
|
|
|
## Set camera to look at a specific point
|
|
func focus_on(point: Vector3) -> void:
|
|
var angle_rad = deg_to_rad(camera_angle)
|
|
target_position = point + Vector3(0, camera_distance * sin(angle_rad),
|
|
camera_distance * cos(angle_rad))
|
|
|
|
## Reset to default position
|
|
func reset_position() -> void:
|
|
_setup_isometric_view()
|