0 votes

I am in space. In the point of origin, I put a model of my starship and a Node3D called CameraPivot. 100m above the origin (x = 0, y = 100, z = 0), I put a Camera3D as a child node of CameraPivot. I rotate the Camera3D by -90° around the x axis and my camera looks at my starship in the point of origin.

My goal: move the mouse to the right/left to rotate right/left. Move the mouse up/down to rotate up/down. I am not on any surface, so my up/down rotation is not clamped. Also, any new mouse movement causes a rotation relative to any previous mouse movements/rotations. Basically, I want to rotate around my spaceship in the center freely using mouse movement.

My approach:

# CameraPivot.gd
func _input(event):
    var mm = event as InputEventMouseMotion
    if mm:
        view_rotate(mm)

func view_rotate(mm : InputEventMouseMotion) -> void:

    # get the last mouse movement as vector in world space
    # i.e. the movement vector
    var vec_mm : Vector3 = $CameraMain.project_position(mm.relative, $CameraMain.position.y)

    # get the vector that points from the CameraPivot in the point of origin
    # to the camera, i.e. the y vector of the basis
    # the cross product with the movement vector is the desired rotation axis
    var vec_rot : Vector3 = basis.y.cross(vec_mm)

    # normalize and use the length of the vector (equal to the length of
    # the movement vector) as the amount by which to rotate
    rotate(vec_rot.normalized(), vec_rot.length() * mouse_sensitivity)

I thought this approach is straightforward enough but I don't understand the result. Instead of rotation depending on mouse movement, the resulting rotation vector points in an almost constant direction and the rotation doesn't even change its sign, when I move the mouse down instead of up.

I looked already on the values of the vectors using print, but it's difficult to infer the problem of my code from there. I might want to display the resulting rotation vector to get an idea of what's going on.

Godot version 4.0alpha4
in Engine by (12 points)

use screen drag

func _input(event):
if event is InputEventScreenDrag:
    print(event.position)
    pass

Please log in or register to answer this question.

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.