You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

47 lines
1.5 KiB
GDScript

extends Node3D
class_name RotateCamera
@export var camera_rotate_sensitivity: float = 0.005
@export var camera_zoom_sensititivy: float = 0.01
@export var zoom_max: float = 10.
@export var zoom_min: float = 0.1
@onready var camera: Camera3D = $Camera3D
var camera_rotate_diff: Vector3 = Vector3()
var camera_zoom_weight: float = .15
var enable_rotate: bool = false
func _process(delta):
self._update_rotation()
self._update_zoom()
func _unhandled_input(event):
if self.enable_rotate and event is InputEventMouseMotion:
self.camera_rotate_diff.y -= event.relative.x
self.camera_rotate_diff.x -= event.relative.y
elif event is InputEventMouseButton:
if event.is_action_pressed("camera_rotate_button"):
self.enable_rotate = true
elif event.is_action_released("camera_rotate_button"):
self.enable_rotate = false
elif event.is_action_pressed("camera_zoom_in"):
self.camera_zoom_weight = clampf(self.camera_zoom_weight - camera_zoom_sensititivy, 0., 1.)
elif event.is_action_pressed("camera_zoom_out"):
self.camera_zoom_weight = clampf(self.camera_zoom_weight + camera_zoom_sensititivy, 0., 1.)
func _update_rotation():
if self.enable_rotate:
self.rotation += self.camera_rotate_diff * camera_rotate_sensitivity
self.camera_rotate_diff = Vector3.ZERO
func _update_zoom():
var from = self.global_position
var to = self.global_position + self.camera.get_global_transform().basis.z * zoom_max
var new_cam_pos = lerp(from, to, camera_zoom_weight)
self.camera.global_position = new_cam_pos