As a hobbyist, I decided to make a 3D game for fun.
I wanted a lock-on system and achieved this by using a spatial node as a pointer. The idea is whenever a key was pressed, the pointer will teleport to the coordinates of an enemy.
This pointer is always at the center of the camera, and the body will occasionally face the pointer and therefore move relative to it. To do this I used look_at() and then used rotated():
look_at($"../CameraBase/Pointer".get_global_transform().origin, Vector3(0, 1, 0))
velocity = velocity.rotated(Vector3(0, 1, 0), rotation.y)
I know I should use a variable to reference the pointer node but I did this for testing sake.
I also wanted accelerating and decelerating player movement, so I used linear_interpolate() to simulate that:
if input: # accelerate
velocity = velocity.linear_interpolate(input, .1)
else: # decelerate
velocity = velocity.linear_interpolate(Vector3(), .1)
Attempting to both rotate and linearly interpolate the kinematic body gets really strange. Almost all the time, if the body is not facing the negative z-axis, then the speed becomes extremely slow.
I can only identify that rotating the body somehow alters the interpolation's calculation, but I don't understand how so and therefore don't understand how to fix it.
Is there a more efficient way of having a lock-on system or is there a fix for this?