Godot Version
4.6.2
Question
I was trying to make a camera for a vehicle that smoothly rotates with direction, but when trying to do this weird issues come up like the head facing the wrong direction, and looking through the inspector and script I can't find any issues. Also the clamp() function I use to limit rotation is all backwards, so the camera will get forced to face in reverse, but still rotates to the parameters of the clamp()
.extends VehicleBody3D
@onready var RearWheel = $VehicleWheelRear
@onready var SteeringWheel = $SteeringWheel
@onready var Steering = $MopedSteering
@onready var FrontFendor = $MopedFrontFendor
@onready var Neck = $Neck
@onready var Head = $Neck/Head
@onready var Camera = $“../Camera3D”
@export var ENGINE_POWER : int = 1600
@export var BRAKE_POWER : int = 20
@export var LOOK_SPEED : float = 0.1
@export var BASE_FOLLOW_SPEED : float = 0.5
var steer_speed : float = 5
var speed : float = 0
var follow_speed = BASE_FOLLOW_SPEED
var max_steer : float = 0.9
func _unhandled_input(event: InputEvent) → void:
#Capturing a mouse means it isn't visible and can't be seen
if event is InputEventMouseButton:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
elif event.is_action_pressed("ui_cancel"):
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
if event is InputEventMouseMotion:
Neck.rotate_y(-event.relative.x * 0.01)
Head.rotate_x(-event.relative.y * 0.01)
#180/-180 degrees is forwards
Neck.rotation_degrees.y = clamp(Neck.rotation_degrees.y, -75, 75)
Head.rotation_degrees.x = clamp(Head.rotation_degrees.x, -45, 45)
print(Neck.rotation_degrees.y)
print(rotation_degrees.y)
#if Neck.rotation_degrees.y >= 55: print("Left")
#if Neck.rotation_degrees.y <= 55: print("Right")
func _physics_process(delta):
#keeps the bike upright by constantly rotating towards the up direction
rotation_degrees.z = move_toward(rotation_degrees.z, 0, 2)
#sets the steering speed and angle to change with speed
speed = RearWheel.get_rpm()
steer_speed = clamp(7/abs(RearWheel.get_rpm()/200),3,7)
max_steer = clamp(0.9/abs(RearWheel.get_rpm()/200),0.5,0.9)
#steers the moped
steering = move_toward(steering, Input.get_axis("right","left") * max_steer, delta * steer_speed)
#switches between braking and reversing depending on speed
if speed > 1:
brake = Input.get_action_strength("down") * BRAKE_POWER
engine_force = Input.get_action_strength("up") * ENGINE_POWER
elif speed <= 1:
engine_force = Input.get_axis("down","up") * ENGINE_POWER
#Rotates the front fendor and handle bar to face the direction of steering.
Steering.rotation_degrees.y = SteeringWheel.rotation_degrees.y
FrontFendor.rotation_degrees.y = SteeringWheel.rotation_degrees.y
#Sets the follow speed of the camera to adapt with speed of the moped
follow_speed = clamp(abs(RearWheel.get_rpm()/750),0.3,1)
#55 is forward for head rotation, don't ask me why
Camera.global_position = lerp(Camera.global_position,Head.global_position,follow_speed)
Camera.global_rotation = Vector3(lerp_angle(Camera.global_rotation.x,Head.global_rotation.x,LOOK_SPEED),lerp_angle(Camera.global_rotation.y,Neck.global_rotation.y,LOOK_SPEED),lerp_angle(Camera.global_rotation.z,Head.global_rotation.z,LOOK_SPEED))
I am new to programming, and I don't know how these forums work but finding a satisfying conclusion would let me sleep in peace.