Have simplified the code to:
extends Node3D
func _physics_process(delta: float) -> void:
turn(delta)
func turn(delta):
var currQ := basis.get_rotation_quaternion()
var curr_angle := currQ.get_angle()
# Let's keep adding some angle to current's angle
var toQ := Quaternion(Vector3.UP, currQ.get_angle() + PI/8)
# find the difference - I hope. Who knows?
var diffQ := toQ.normalized() * currQ.inverse()
var diff_angle:= diffQ.get_angle()
print(" curr's angle:", rad_to_deg(curr_angle))
print(" diffQ's ANGLE:", rad_to_deg( diff_angle))
print(" SUM:", rad_to_deg(curr_angle + diff_angle ))
print(" TO angle:", rad_to_deg( toQ.get_angle()), " SHOULD EQUAL SUM")
print()
%pointy.rotate_y(diff_angle)
assert(is_equal_approx(diff_angle, PI/8),"STOP")
Let it run and it will stop when the numbers get funky. Then go look at the output:
diffQ's ANGLE:22.4999476921535
SUM:22.4999476921535
TO angle:22.5000177015925 SHOULD EQUAL SUM
curr's angle:22.4999476921535
diffQ's ANGLE:22.4999476921535
SUM:44.9998953843069
TO angle:44.9999534409149 SHOULD EQUAL SUM
curr's angle:44.9999022144961
diffQ's ANGLE:22.5000177015925
SUM:67.4999199160886
TO angle:67.499904548163 SHOULD EQUAL SUM
curr's angle:67.4999182085413
diffQ's ANGLE:22.5000177015925
SUM:89.9999359101338
TO angle:89.9999273723973 SHOULD EQUAL SUM
curr's angle:89.9999342025865
diffQ's ANGLE:22.5000177015925
SUM:112.499951904179
TO angle:112.499943366442 SHOULD EQUAL SUM
curr's angle:112.499957026821
diffQ's ANGLE:22.5000177015925
SUM:134.999974728413
TO angle:134.999959360488 SHOULD EQUAL SUM
curr's angle:134.999973020866
diffQ's ANGLE:22.4999818430993
SUM:157.499954863965
TO angle:157.499968524344 SHOULD EQUAL SUM
curr's angle:157.499954863965
diffQ's ANGLE:22.5000177015925
SUM:179.999972565558
TO angle:179.999950367443 SHOULD EQUAL SUM
curr's angle:179.999964027821
diffQ's ANGLE:22.4999818430993
SUM:202.499945870921
TO angle:202.499959531299 SHOULD EQUAL SUM
curr's angle:202.499945870921
diffQ's ANGLE:22.4999818430993
SUM:224.99992771402
TO angle:224.999941374398 SHOULD EQUAL SUM
curr's angle:224.99992771402
diffQ's ANGLE:22.4999476921535
SUM:247.499875406173
TO angle:247.499936877876 SHOULD EQUAL SUM
(Here we are at angle 247 degrees, but ...
suddenly it reads as 112 degrees?
Which is maybe why the movement goes wrong.)
curr's angle:112.500120951361
diffQ's ANGLE:247.500237406199
SUM:360.00035835756
TO angle:135.000123285028 SHOULD EQUAL SUM
--- Debugging process stopped ---