Inconsistent camera rotation between x and y axis - FPS controller

Godot Version

4.2.2

Question

So I’m trying to recode my fps controller through composition to try make it more modular. However, for the camera movement I’m having issues. The camera input is correctly being moved to the movement component through signals, however the speed at which the camera rotates on the x axis is extremely slow. For rotating on the y axis I’m just rotating the player itself rather than the camera, however for this the player rotates extremely fast.

I used this method of rotation previously and it was working okay, this was when everything was in one script.

InputComponent.gd:

class_name InputComponent extends Node

signal movement(movement_input: Vector2)
signal camera_movement(mouse_delta: Vector2)

@export var MouseSensitivity: float = 2.0

func _ready():
	Input.mouse_mode = Input.MOUSE_MODE_CAPTURED

func _input(event):
	if event.is_action_pressed("exit"):
		get_tree().quit()

	var movement_input = Input.get_vector("movement_left", "movement_right", "movement_forward", "movement_back")
	emit_signal("movement", movement_input)

func _unhandled_input(event):
	var mouse_input = event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED
	if mouse_input:
		var mouse_delta = -event.relative
		emit_signal("camera_movement", mouse_delta)

MovementComponent.gd:

extends Node

@export_category("Components")
@export var Camera: Camera3D
@export var CharacterController: CharacterBody3D
@export var InputReceiver: InputComponent:
    set(value):
        InputReceiver = value
        InputReceiver.movement.connect(on_movement_input)
        InputReceiver.camera_movement.connect(on_camera_movement)

@export_category("Movement Settings")
@export var MovementSpeed: float = 5.0
@export var CameraPitchMin: float = -90
@export var CameraPitchMax: float = 90

var movement_direction: Vector3 = Vector3.ZERO
var mouse_rotation: Vector3 = Vector3.ZERO
var player_rotation: Vector3 = Vector3.ZERO 
var camera_rotation: Vector3 = Vector3.ZERO
var mouse_delta_input: Vector2 = Vector2.ZERO

func on_movement_input(movement_input: Vector2) -> void:
    movement_direction = (CharacterController.transform.basis * Vector3(movement_input.x, 0, movement_input.y)).normalized()
    var vel = Vector2(movement_direction.x, movement_direction.z)

func on_camera_movement(mouse_delta: Vector2) -> void:
    var delta = get_process_delta_time()
    mouse_rotation.x += mouse_delta.y * delta
    mouse_rotation.y += mouse_delta.x * delta

    mouse_rotation.x = clamp(mouse_rotation.x, CameraPitchMin, CameraPitchMax)

func _physics_process(delta):
    if CharacterController == null:
        push_warning("CharacterController component is not set!")
        return

    if Camera == null:
        push_warning("Camera component is not set!")
        return

    player_rotation = Vector3(0, mouse_rotation.y, 0)
    camera_rotation = Vector3(mouse_rotation.x, 0, 0)

    camera_rotation *= delta
    Camera.transform.basis = Basis.from_euler(camera_rotation)
    Camera.rotation.z = 0

    # Rotate the player
    CharacterController.transform.basis = Basis.from_euler(player_rotation)

    mouse_delta_input = Vector2.ZERO

    if movement_direction:
        CharacterController.velocity.x = movement_direction.x * MovementSpeed
        CharacterController.velocity.z = movement_direction.z * MovementSpeed
    else:
        CharacterController.velocity.x = 0
        CharacterController.velocity.z = 0

    CharacterController.move_and_slide()

Any help on this is greatly appreciated :slight_smile:

For anyone else that may have had a similar issue, managed to fix it! Problem was I was multiplying mouse_rotation variable by delta twice which was causing it to be too slow.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.