Spin main rotor when receiving data from flight model›

This commit is contained in:
Marek S. Łukasiewicz 2025-02-18 15:29:06 +01:00
parent ab91016524
commit 2869d390f8
4 changed files with 83 additions and 16 deletions

View file

@ -3,14 +3,21 @@ extends Node3D
## Rotation of cyclic stick model for full control deflection, in degrees
@export var range_cyclic: float = 30
## Main rotor speed, in revolutions per minute
@export var rotor_rpm: float = 500
## Current angle of rotor rotation
var _rotor_azimuth: float = 0
@onready var connector: MarshConnector = $MarshConnector
@onready var skeleton: Skeleton3D = $"Mi-2/Armature/Skeleton3D"
@onready var attitude_root: Node3D = $AttitudeRoot
@onready var bone_cg: int = skeleton.find_bone("BodyCG")
@onready var bone_cyclic: int = skeleton.find_bone("Cyclic")
@onready var bone_rotor: int = skeleton.find_bone("Rotor")
func _process(_delta: float) -> void:
func _process(delta: float) -> void:
var target := connector.get_aircraft()
position = target.origin
@ -28,3 +35,11 @@ func _process(_delta: float) -> void:
var cyc_angles_rad := cyclic * deg_to_rad(range_cyclic)
var cyc_att := Quaternion.from_euler(Vector3(cyc_angles_rad.y, cyc_angles_rad.x, 0))
skeleton.set_bone_pose_rotation(bone_cyclic, cyc_att * cyc_rest)
# Spin the rotor only when receiving flight data
if connector.get_model_connected():
_rotor_azimuth += rotor_rpm * 2 * PI / 60 * delta
var rotor_rest := skeleton.get_bone_rest(bone_rotor).basis.get_rotation_quaternion()
var rotor_att := Quaternion.from_euler(Vector3(0, _rotor_azimuth, 0))
# Note that this is reverse order, to rotate in local bone axes
skeleton.set_bone_pose_rotation(bone_rotor, rotor_rest * rotor_att)

View file

@ -16,10 +16,13 @@ material_override = SubResource("StandardMaterial3D_mrxe8")
[node name="AttitudeRoot" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.4, 0)
[node name="XROrigin3D" type="XROrigin3D" parent="AttitudeRoot"]
transform = Transform3D(-1, 0, -8.74227e-08, 0, 0.999999, 0, 8.74228e-08, 0, -0.999999, 0.214, -0.721897, 1.53478)
[node name="PilotEyes" type="Node3D" parent="AttitudeRoot"]
editor_description = "Added only to provide a convenient point to reset XROrigin3D to"
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0.214, -0.721897, 1.53478)
[node name="XRCamera3D" type="XRCamera3D" parent="AttitudeRoot/XROrigin3D"]
[node name="XROrigin3D" type="XROrigin3D" parent="AttitudeRoot/PilotEyes"]
[node name="XRCamera3D" type="XRCamera3D" parent="AttitudeRoot/PilotEyes/XROrigin3D"]
[node name="MarshConnector" type="MarshConnector" parent="."]