diff --git a/godot/RawAssets/Soldier/SoldierM.blend b/godot/RawAssets/Soldier/SoldierM.blend index 2ab8f7c..4744b7c 100644 Binary files a/godot/RawAssets/Soldier/SoldierM.blend and b/godot/RawAssets/Soldier/SoldierM.blend differ diff --git a/godot/RawAssets/Soldier/SoldierM.blend1 b/godot/RawAssets/Soldier/SoldierM.blend1 index 585d049..2ab8f7c 100644 Binary files a/godot/RawAssets/Soldier/SoldierM.blend1 and b/godot/RawAssets/Soldier/SoldierM.blend1 differ diff --git a/godot/scenes/player/local_player.tscn b/godot/scenes/player/local_player.tscn index 37d7031..289c465 100644 --- a/godot/scenes/player/local_player.tscn +++ b/godot/scenes/player/local_player.tscn @@ -16,7 +16,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.8724979, -0.2644562) current = true [node name="soldier_m" parent="." unique_id=281995630 instance=ExtResource("1_jd651")] -transform = Transform3D(-0.5, 0, -4.371139e-08, 0, 0.5, 0, 4.371139e-08, 0, -0.5, 0, 0, 0) +transform = Transform3D(-0.5, 0, -4.371139e-08, 0, 0.5, 0, 4.371139e-08, 0, -0.5, 0, 0, -1.1592964) visible = false [node name="collision_shape_3d2" type="CollisionShape3D" parent="." unique_id=442150782] diff --git a/godot/scenes/player/soldier_m.tscn b/godot/scenes/player/soldier_m.tscn index 6a8967d..98c317e 100644 --- a/godot/scenes/player/soldier_m.tscn +++ b/godot/scenes/player/soldier_m.tscn @@ -2,6 +2,7 @@ [ext_resource type="PackedScene" uid="uid://cw7duhhjebypt" path="res://scenes/player/raygun.tscn" id="1_a50o4"] [ext_resource type="PackedScene" uid="uid://ncxcmgdit2j1" path="res://mesh/soldier_m.tscn" id="1_sxefq"] +[ext_resource type="PackedScene" uid="uid://cg81784ct8gf5" path="res://mesh/raygun.tscn" id="3_jbny0"] [sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_a50o4"] animation = &"Soldier|StrafeLeft" @@ -43,22 +44,22 @@ nodes/Movement/node = SubResource("AnimationNodeBlendSpace2D_tt88r") nodes/Movement/position = Vector2(350, 90) node_connections = [&"output", 0, &"Movement"] -[node name="soldier_m" type="SoldierMesh" unique_id=281995630 node_paths=PackedStringArray("hand_attachment", "animation_tree", "skeleton", "skeleton_modifier")] +[node name="soldier_m" type="SoldierMesh" unique_id=281995630 node_paths=PackedStringArray("hand_attachment", "animation_tree", "skeleton", "look_at")] hand_attachment = NodePath("bone_attachment_3d/hand") animation_tree = NodePath("animation_tree") skeleton = NodePath("SoldierM/Soldier/Skeleton3D") raygun = ExtResource("1_a50o4") -skeleton_modifier = NodePath("SoldierM/Soldier/Skeleton3D/soldier_skeleton_modifier") +look_at = NodePath("look_at_root") [node name="SoldierM" parent="." unique_id=1868587353 instance=ExtResource("1_sxefq")] [node name="Skeleton3D" parent="SoldierM/Soldier" parent_id_path=PackedInt32Array(1868587353, 803584260) index="0" unique_id=1574145981] bones/0/position = Vector3(0, 0, 0.00071418716) bones/1/position = Vector3(0, 0, -0.007) -bones/1/rotation = Quaternion(0.7044769, 0, 0, 0.709727) +bones/1/rotation = Quaternion(0.70569277, 0, 0, 0.7085179) bones/1/scale = Vector3(1, 1, 1) bones/2/position = Vector3(0.002, 3.469447e-18, -1.4901118e-10) -bones/2/rotation = Quaternion(0.9504327, 2.1033886e-08, 2.357445e-08, -0.31093037) +bones/2/rotation = Quaternion(0.9509405, 2.0995262e-08, 2.3608855e-08, -0.30937394) bones/2/scale = Vector3(1, 1, 1) bones/3/position = Vector3(0, 0.0069999984, 5.169879e-25) bones/3/scale = Vector3(1, 0.99999994, 1) @@ -66,7 +67,7 @@ bones/4/position = Vector3(-2.39752e-11, 0.010049875, -1.4156722e-10) bones/4/rotation = Quaternion(0.73982674, -2.6881349e-08, 7.0005948e-09, 0.67279744) bones/4/scale = Vector3(1, 0.99999994, 0.99999994) bones/6/position = Vector3(-0.002, 3.469447e-18, -1.4901205e-10) -bones/6/rotation = Quaternion(0.9992136, 1.7910667e-08, 1.8908183e-08, 0.039652776) +bones/6/rotation = Quaternion(0.99916035, 1.7885682e-08, 1.893182e-08, 0.04097233) bones/6/scale = Vector3(1, 1, 1) bones/7/position = Vector3(0, 0.0069999984, -5.169879e-25) bones/7/rotation = Quaternion(-0.21973656, 4.264305e-08, 9.604991e-09, 0.9755593) @@ -75,33 +76,33 @@ bones/8/position = Vector3(-2.3975525e-11, 0.010049875, -4.6138777e-11) bones/8/rotation = Quaternion(0.86758894, -7.867721e-09, 3.036851e-08, 0.4972821) bones/8/scale = Vector3(1, 0.99999994, 0.99999994) bones/10/position = Vector3(0, 0.009, 0) -bones/10/rotation = Quaternion(-0.16860254, -0.13138649, 0.021690987, 0.9766475) +bones/10/rotation = Quaternion(-0.1704422, -0.13139531, 0.021929594, 0.9763216) bones/10/scale = Vector3(1, 1, 1) bones/11/position = Vector3(6.8186457e-17, 0.008, 0.001) -bones/11/rotation = Quaternion(0.011738047, 2.356739e-05, -0.003212238, 0.999926) +bones/11/rotation = Quaternion(0.005668696, 1.1375248e-05, -0.0015512996, 0.9999828) bones/11/scale = Vector3(1, 1, 1) bones/12/position = Vector3(-2.2285185e-16, 0.0035, 0.0015000002) bones/12/rotation = Quaternion(-0.70710677, 0, 0, 0.70710677) bones/12/scale = Vector3(1, 1, 1) bones/14/position = Vector3(0.005, 0.005, -1.7336413e-21) -bones/14/rotation = Quaternion(0.8844465, 0.032357745, 0.43648675, -0.16182332) +bones/14/rotation = Quaternion(0.88285106, 0.032361757, 0.43712845, -0.16865772) bones/14/scale = Vector3(1, 0.99999994, 1) bones/15/position = Vector3(-1.3005262e-15, 0.0050000004, -6.938894e-18) -bones/15/rotation = Quaternion(1.0181552e-08, -7.03121e-09, 0.92124933, 0.38897285) +bones/15/rotation = Quaternion(1.0160434e-08, -7.0616895e-09, 0.92007947, 0.39173177) bones/15/scale = Vector3(1, 1, 1) bones/16/position = Vector3(7.632945e-11, 0.007071071, 6.938894e-18) -bones/16/rotation = Quaternion(0.025212372, -0.04779956, -0.18591446, 0.9810787) +bones/16/rotation = Quaternion(0.027662799, -0.041891776, -0.18596037, 0.981274) bones/16/scale = Vector3(0.99999994, 0.9999999, 1) bones/18/position = Vector3(-0.005, 0.005, -1.7303326e-21) -bones/18/rotation = Quaternion(0.64759296, 0.20328435, -0.1040828, -0.7269564) +bones/18/rotation = Quaternion(0.64603364, 0.20885898, -0.09923112, -0.7274418) bones/18/scale = Vector3(1, 0.99999994, 1) bones/19/position = Vector3(-1.3005262e-15, 0.0050000004, -6.938894e-18) -bones/19/rotation = Quaternion(-1.8158344e-08, -3.722307e-08, -0.18551208, 0.98264205) +bones/19/rotation = Quaternion(-1.7631736e-08, -3.747539e-08, -0.17163937, 0.98515993) bones/19/scale = Vector3(1, 1, 1) bones/20/position = Vector3(-2.2286711e-10, 0.007071072, 0) -bones/20/rotation = Quaternion(-0.1351793, -0.45971006, -0.16690832, 0.86170465) +bones/20/rotation = Quaternion(-0.13869229, -0.45811948, -0.17229414, 0.8609331) bones/20/scale = Vector3(1, 0.9999999, 1) -bones/22/position = Vector3(0.012072118, -0.0085772155, 0.0023066779) +bones/22/position = Vector3(0.012243621, -0.0085772155, 0.0022597443) bones/22/rotation = Quaternion(3.090862e-08, 0.70710677, 0.70710677, 3.090862e-08) bones/22/scale = Vector3(1, 1, 1) bones/24/position = Vector3(-0.011000002, 0.0050000013, 0.0070000007) @@ -120,18 +121,46 @@ bones/34/scale = Vector3(1, 1, 1) bones/36/position = Vector3(-0.002, -0.00568604, -0.02264523) bones/36/rotation = Quaternion(0, 0, 0, 1) -[node name="soldier_skeleton_modifier" type="SoldierSkeletonModifier" parent="SoldierM/Soldier/Skeleton3D" index="1" unique_id=248671730] -transform = Transform3D(1, -2.2737368e-13, 0, 2.2737368e-13, 1, 0, -1.3552527e-20, 0, 1, 0.007936426, -0.022856388, 0.010735709) +[node name="look_at_modifier_3d" type="LookAtModifier3D" parent="SoldierM/Soldier/Skeleton3D" index="1" unique_id=1054155740] +target_node = NodePath("../../../../look_at_root/look_at") +bone_name = "HEAD" +bone = 11 +forward_axis = 5 +origin_from = 2 +origin_external_node = NodePath("../../../../look_at_root") + +[node name="look_at_modifier_3d2" type="LookAtModifier3D" parent="SoldierM/Soldier/Skeleton3D" index="2" unique_id=916451501] +transform = Transform3D(1, -2.2737368e-13, 0, 2.2737368e-13, 1, 0, -1.3552527e-20, 0, 1, 0, 0, 0) +target_node = NodePath("../../../../look_at_root/look_at") +bone_name = "UA.R" +bone = 14 +forward_axis = 1 +relative = true +origin_from = 2 +origin_external_node = NodePath("../../../../look_at_root") + +[node name="look_at_modifier_3d3" type="LookAtModifier3D" parent="SoldierM/Soldier/Skeleton3D" index="3" unique_id=1721786929] +transform = Transform3D(1, -6.82121e-13, 0, 6.82121e-13, 1, 0, -4.065758e-20, 0, 1, 0, 0, 0) +target_node = NodePath("../../../../look_at_root/look_at") +bone_name = "UA.L" +bone = 18 +forward_axis = 2 +primary_rotation_axis = 2 +relative = true +origin_from = 2 +origin_external_node = NodePath("../../../../look_at_root") [node name="bone_attachment_3d" type="BoneAttachment3D" parent="." unique_id=1964353847] -transform = Transform3D(-16.315157, 39.74509, -90.300285, -95.4447, 16.81778, 24.646877, 24.982435, 90.208015, 35.19075, -0.20875436, 3.1938982, 0.68449914) +transform = Transform3D(-31.74573, 3.559949, -94.760414, -86.96872, 38.738197, 30.590748, 37.797493, 92.12316, -9.201678, -0.47878417, 3.3534346, 0.7443533) bone_name = "HAND.R_end" bone_idx = 17 use_external_skeleton = true external_skeleton = NodePath("../SoldierM/Soldier/Skeleton3D") [node name="hand" type="Node3D" parent="bone_attachment_3d" unique_id=171636900] -transform = Transform3D(0.0009882095, -0.014535081, -0.0035712845, -0.0056050573, 0.0029592454, -0.0135950465, 0.0138782775, 0.0022301476, -0.0052363835, 0.0019110721, -0.0009642476, -0.000241803) +transform = Transform3D(0.0039180024, -0.013382489, -0.0055279233, 0.00012702314, 0.005758277, -0.013850107, 0.014478719, 0.0035708423, 0.0016173583, 0.003051471, -0.0019010007, -0.002960747) + +[node name="Raygun" parent="bone_attachment_3d/hand" unique_id=1928455392 instance=ExtResource("3_jbny0")] [node name="animation_tree" type="AnimationTree" parent="." unique_id=1221968603] root_node = NodePath("../SoldierM") @@ -139,4 +168,10 @@ tree_root = SubResource("AnimationNodeBlendTree_kgpx5") anim_player = NodePath("../SoldierM/AnimationPlayer") parameters/Movement/blend_position = Vector2(0, 0) +[node name="look_at_root" type="Node3D" parent="." unique_id=107308061] +transform = Transform3D(1, 0, 0, 0, 1.0000001, 0, 0, 0, 1.0000001, 0, 3.7622375, 0) + +[node name="look_at" type="Node3D" parent="look_at_root" unique_id=1308525699] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 2.698) + [editable path="SoldierM"] diff --git a/rust/src/soldier_mesh.rs b/rust/src/soldier_mesh.rs index 053ccfa..44cca6b 100644 --- a/rust/src/soldier_mesh.rs +++ b/rust/src/soldier_mesh.rs @@ -18,7 +18,7 @@ pub struct SoldierMesh { #[export] raygun: Option>, #[export] - skeleton_modifier: Option>, + look_at: Option>, base: Base, } @@ -36,8 +36,8 @@ impl SoldierMesh { } pub fn update_y_look(&mut self, rotation: f32) { - if let Some(skeleton) = &mut self.skeleton_modifier { - skeleton.bind_mut().rotation = rotation; + if let Some(node) = &mut self.look_at { + node.set_rotation(Vector3::RIGHT * -rotation); } } @@ -54,30 +54,3 @@ impl SoldierMesh { } } } - -#[derive(GodotClass)] -#[class(base=SkeletonModifier3D, init)] -pub struct SoldierSkeletonModifier { - pub rotation: f32, - - base: Base, -} - -#[godot_api] -impl ISkeletonModifier3D for SoldierSkeletonModifier { - fn process_modification_with_delta(&mut self, _delta: f64) { - let rot = self.rotation; - let rhand_quat = Quaternion::from_euler(Vector3::FORWARD * -rot); - let lhand_quat = Quaternion::from_euler(Vector3::RIGHT * rot); - if let Some(skeleton) = &mut self.base_mut().get_skeleton() { - let head_idx = skeleton.find_bone("HEAD"); - let uar_idx = skeleton.find_bone("UA.R"); - let uar_rot = skeleton.get_bone_pose_rotation(uar_idx); - let ual_idx = skeleton.find_bone("UA.L"); - let ual_rot = skeleton.get_bone_pose_rotation(ual_idx); - skeleton.set_bone_pose_rotation(head_idx, Quaternion::from_euler(Vector3::RIGHT * rot)); - skeleton.set_bone_pose_rotation(uar_idx, uar_rot * rhand_quat); - skeleton.set_bone_pose_rotation(ual_idx, ual_rot * lhand_quat); - } - } -}