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
47 lines
1.5 KiB
GDScript
8 months ago
|
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
|
||
|
|