godot3 how to rotate x or pitch correct to target align?

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By Lightnet

Tired to get part of pitch to work but the rotate is not working correct as I know little about how it work. Just trying out it but not sure how to get the math stuff work out.

Here the sample build. GitHub - Lightnet/gd3mechs at be95c65eacdcfa21daa84ab7e3f39530655f6194

TurretTarget.tscn < Scene test.

extends Spatial

var camera
var mouse_pos = Vector2()
var point
#var dir = Vector3()
var skeleton
var bonename
var boneid
#var base = Vector3()
var basepos = Vector3()
var pitchpos = Vector3()

var angle = 0

func _ready():
	camera = get_node("/root/Node/Spatial/Camera")
	skeleton = get_node("Armature/Skeleton")
	set_process(true)

func _input(event):
	if event is InputEventMouseMotion:
		mouse_pos = event.position

func _process(delta):
	# Called every frame. Delta is time since last frame.
	# Update game logic here.

	# Project mouse into a 3D ray
	var ray_origin = camera.project_ray_origin(mouse_pos)
	var ray_direction = camera.project_ray_normal(mouse_pos)

	# Cast a ray
	var from = ray_origin
	var to = ray_origin + ray_direction * 1000.0
	var space_state = get_world().get_direct_space_state()
	var hit = space_state.intersect_ray(from, to)
	if hit.size() != 0:
		#point.transform.origin = hit.position
		#dir = (hit.position - get_global_transform().origin).normalized()
		#basepos = hit.position * -1 #default?
		basepos = hit.position
		#basepos.y = 0
		#pitchpos = hit.position * -1
		pitchpos = hit.position
		#pitchpos.x = 0
	setbaserotation(delta)
	setpitchrotation(delta)

func setbaserotation(delta):
	bonename = "Base"
	boneid = skeleton.find_bone(bonename)
	var chassis_transform = get_parent().get_global_transform()
	var turret_transform = skeleton.get_bone_pose(boneid)

	# vector for rotation axis of turret
	var turret_up = chassis_transform.basis.y.normalized()

	# plane trough turret
	var p1 = turret_transform.origin
	var p2 = p1 + turret_transform.basis.x
	var p3 = p1 + turret_transform.basis.z

	var plane = Plane(p1, p2, p3)
	var look_at = plane.project(basepos)
	if typeof(look_at) == TYPE_VECTOR3:
		var x = (look_at - turret_transform.origin).normalized()
		var y = turret_up.normalized()
		var z = x.cross(y).normalized()
		var quaternion_current = Quat(turret_transform.basis)
		var dir = Basis(x, y, z)
		dir = dir.rotated( Vector3(0,1,0), deg2rad(90))
		var quaternion_new = quaternion_current.slerp(dir, delta*3.0)
		var transb = Transform(quaternion_new, turret_transform.origin)

		skeleton.set_bone_pose( boneid, transb )

func setpitchrotation(delta):
	bonename = "turret"
	boneid = skeleton.find_bone(bonename)
	var chassis_transform = get_parent().get_global_transform()
	var turret_transform = skeleton.get_bone_pose(boneid)

	# vector for rotation axis of turret
	var turret_up = chassis_transform.basis.x.normalized()

	# plane trough turret
	#var p1 = turret_transform.origin
	#var p2 = p1 + turret_transform.basis.x
	#var p3 = p1 + turret_transform.basis.z

	var p1 = turret_transform.origin + turret_transform.basis.y
	var p2 = turret_transform.origin
	var p3 = turret_transform.origin + turret_transform.basis.z

	var plane = Plane(p1, p2, p3)
	var look_at = plane.project(pitchpos * -1)
	if typeof(look_at) == TYPE_VECTOR3:
		#var x = (look_at - turret_transform.origin).normalized()
		#var y = turret_up.normalized()
		#var z = x.cross(y).normalized()

		var x = turret_up.normalized()
		var y = (look_at - turret_transform.origin).normalized()
		var z = x.cross(y).normalized()
		
		var quaternion_current = Quat(turret_transform.basis)
		
		var dir = Basis(x, y, z)
		dir = dir.rotated( Vector3(1,0,0), deg2rad(90)) #rotate x
		dir = dir.rotated( Vector3(0,1,0), deg2rad(180)) #rotate inverse
		var quaternion_new = quaternion_current.slerp( dir , delta*3.0)
		var transb = Transform(quaternion_new, turret_transform.origin)
		skeleton.set_bone_pose( boneid, transb )
	pass