41 lines
1.3 KiB
GDScript
41 lines
1.3 KiB
GDScript
extends Node3D
|
|||
|
|
class_name AxisNode
|
||
|
|
|
||
|
|
|
||
|
|
var axis_length: float = 1.
|
||
|
|
|
||
|
|
|
||
|
|
# Called when the node enters the scene tree for the first time.
|
||
|
|
func _ready() -> void:
|
||
|
|
_setup_axis()
|
||
|
|
|
||
|
|
|
||
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
||
|
|
func _process(delta: float) -> void:
|
||
|
|
pass
|
||
|
|
|
||
|
|
func _setup_axis():
|
||
|
|
var x_basis = Vector3(1, 0, 0)
|
||
|
|
var y_basis = Vector3(0, 1, 0)
|
||
|
|
var z_basis = Vector3(0, 0, 1)
|
||
|
|
var x_node: MeshInstance3D = get_node("x_axis")
|
||
|
|
x_node.scale = Vector3(0.1, axis_length/2, 0.1)
|
||
|
|
x_node.quaternion = _get_quaternion_rotation(Vector3(0,1,0), x_basis)
|
||
|
|
x_node.position = Vector3(axis_length/2, 0, 0)
|
||
|
|
var y_node = get_node("y_axis")
|
||
|
|
y_node.scale = Vector3(0.1, axis_length/2, 0.1)
|
||
|
|
y_node.quaternion = _get_quaternion_rotation(Vector3(0,1,0), y_basis)
|
||
|
|
y_node.position = Vector3(0, axis_length/2, 0)
|
||
|
|
var z_node = get_node("z_axis")
|
||
|
|
z_node.scale = Vector3(0.1, axis_length/2, 0.1)
|
||
|
|
z_node.quaternion = _get_quaternion_rotation(Vector3(0,1,0), z_basis)
|
||
|
|
z_node.position = Vector3(0, 0, axis_length/2)
|
||
|
|
|
||
|
|
func _get_quaternion_rotation(start_vector: Vector3, end_vector: Vector3):
|
||
|
|
var rot_axis: Vector3 = end_vector.cross(start_vector).normalized()
|
||
|
|
if rot_axis.length_squared() == 0.:
|
||
|
|
return Quaternion.IDENTITY
|
||
|
|
var rot_angle: float = end_vector.angle_to(start_vector)
|
||
|
|
var quat = Quaternion(rot_axis, rot_angle).normalized()
|
||
|
|
return quat
|