From c30016dc20f50ca6cd3e682601e9921d22989dbd Mon Sep 17 00:00:00 2001 From: pgcomai Date: Mon, 22 Sep 2025 12:32:04 -0700 Subject: [PATCH 01/17] make tracking local to model --- Core/UI/Images/icons/128x128.png.import | 34 ++++++++++++ Core/UI/Images/icons/256x256.png.import | 34 ++++++++++++ Core/UI/Images/icons/32x32.png.import | 34 ++++++++++++ Core/UI/Images/icons/512x512.png.import | 34 ++++++++++++ Core/UI/Images/icons/64x64.png.import | 34 ++++++++++++ Core/UI/Images/icons/kiri_smug.png.import | 34 ++++++++++++ Mods/MediaPipe/MediaPipeController.gd | 14 ++--- Mods/PoseIK/PoseIK.gd | 67 +++++++++++++++++------ addons/TwitchGD4 | 2 +- 9 files changed, 263 insertions(+), 24 deletions(-) create mode 100644 Core/UI/Images/icons/128x128.png.import create mode 100644 Core/UI/Images/icons/256x256.png.import create mode 100644 Core/UI/Images/icons/32x32.png.import create mode 100644 Core/UI/Images/icons/512x512.png.import create mode 100644 Core/UI/Images/icons/64x64.png.import create mode 100644 Core/UI/Images/icons/kiri_smug.png.import diff --git a/Core/UI/Images/icons/128x128.png.import b/Core/UI/Images/icons/128x128.png.import new file mode 100644 index 00000000..347f10d4 --- /dev/null +++ b/Core/UI/Images/icons/128x128.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djo6xmxg8hvkx" +path="res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/128x128.png" +dest_files=["res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/256x256.png.import b/Core/UI/Images/icons/256x256.png.import new file mode 100644 index 00000000..f5c9c123 --- /dev/null +++ b/Core/UI/Images/icons/256x256.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bhaoj4xliepky" +path="res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/256x256.png" +dest_files=["res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/32x32.png.import b/Core/UI/Images/icons/32x32.png.import new file mode 100644 index 00000000..c0bcc3d1 --- /dev/null +++ b/Core/UI/Images/icons/32x32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://wck0dl8edh62" +path="res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/32x32.png" +dest_files=["res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/512x512.png.import b/Core/UI/Images/icons/512x512.png.import new file mode 100644 index 00000000..0bde6998 --- /dev/null +++ b/Core/UI/Images/icons/512x512.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://4sq74ycyxrje" +path="res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/512x512.png" +dest_files=["res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/64x64.png.import b/Core/UI/Images/icons/64x64.png.import new file mode 100644 index 00000000..0b6d4e57 --- /dev/null +++ b/Core/UI/Images/icons/64x64.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dvb22jyk5x02p" +path="res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/64x64.png" +dest_files=["res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/kiri_smug.png.import b/Core/UI/Images/icons/kiri_smug.png.import new file mode 100644 index 00000000..776f2b72 --- /dev/null +++ b/Core/UI/Images/icons/kiri_smug.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dyy0ftxk42lx7" +path="res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/kiri_smug.png" +dest_files=["res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Mods/MediaPipe/MediaPipeController.gd b/Mods/MediaPipe/MediaPipeController.gd index e8d3ff34..68cefe03 100644 --- a/Mods/MediaPipe/MediaPipeController.gd +++ b/Mods/MediaPipe/MediaPipeController.gd @@ -248,13 +248,13 @@ func scene_init(): last_parsed_data = {} # Move hand "rest" trackers into the scene. - var root = get_skeleton().get_parent() - var left_rest = $LeftHandRestReference - var right_rest = $RightHandRestReference - remove_child(left_rest) - remove_child(right_rest) - root.add_child(left_rest) - root.add_child(right_rest) + #var root = get_skeleton().get_parent() + #var left_rest = $LeftHandRestReference + #var right_rest = $RightHandRestReference + #remove_child(left_rest) + #remove_child(right_rest) + #root.add_child(left_rest) + #root.add_child(right_rest) # Set the head tracker to match the model's head position. var head_bone_index = get_skeleton().find_bone("Head") diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index 98e69bac..6532bf67 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -213,9 +213,36 @@ func _update_local_trackers() -> void: var tracker_dict : Dictionary = get_global_mod_data("trackers") - $Head.global_transform = tracker_dict["head"].transform - $Hand_Left.global_transform = tracker_dict["hand_left"].transform - $Hand_Right.global_transform = tracker_dict["hand_right"].transform + var model = get_model() + + var new_head_basis: Basis = tracker_dict["head"].transform.basis.rotated( + Vector3.UP, + model.global_rotation.y) + var new_head_pos: Vector3 = tracker_dict["head"].transform.origin.rotated( + Vector3.UP, + model.global_rotation.y)\ + + model.global_position + var new_hand_l_basis: Basis = tracker_dict["hand_left"].transform.basis.rotated( + Vector3.UP, + model.global_rotation.y) + var new_hand_l_pos: Vector3 = tracker_dict["hand_left"].transform.origin.rotated( + Vector3.UP, + model.global_rotation.y)\ + + model.global_position + var new_hand_r_basis: Basis = tracker_dict["hand_right"].transform.basis.rotated( + Vector3.UP, + model.global_rotation.y) + var new_hand_r_pos: Vector3 = tracker_dict["hand_right"].transform.origin.rotated( + Vector3.UP, + model.global_rotation.y)\ + + model.global_position + + $Head.global_transform = Transform3D(new_head_basis, + new_head_pos) + $Hand_Left.global_transform = Transform3D(new_hand_l_basis, + new_hand_l_pos) + $Hand_Right.global_transform = Transform3D(new_hand_r_basis, + new_hand_r_pos) # https://ai.google.dev/edge/mediapipe/solutions/vision/hand_landmarker var mediapipe_hand_landmark_names : Array = [ @@ -322,7 +349,7 @@ func _process(delta : float) -> void: var z_pole_dist = 10.0 var y_pole_dist = 5.0 - for chain_name in ["arm_left", "arm_right"]: + for chain_name: String in ["arm_left", "arm_right"]: var tracker_to_use = $Hand_Left var compensation_alpha_scale = 1.0 @@ -332,11 +359,11 @@ func _process(delta : float) -> void: compensation_alpha_scale *= -1.0 pole_target_x = -x_pole_dist - var tracker_local_position = \ - skel.get_global_transform().inverse() * tracker_to_use.get_global_transform() + var tracker_local_transform = \ + tracker_dict[chain_name.replace("arm", "hand")].transform var base_bone_position = skel.get_bone_global_pose( skel.find_bone(_ikchains_dict[chain_name].base_bone)).origin - #print(tracker_local_position.origin.x - bone_position.x) + #print(tracker_local_transform.origin.x - bone_position.x) # See if we can raise the shoulders for when arms go too far up. if chain_name == "arm_left" or chain_name == "arm_right": @@ -357,20 +384,27 @@ func _process(delta : float) -> void: var shoulder_pose = skel.get_bone_global_pose(shoulder_bone_index) var chest_pose_inv = chest_pose.inverse() var shoulder_y = (chest_pose_inv * shoulder_pose).origin.y - var tracker_local_chest = chest_pose_inv * tracker_local_position + var tracker_local_chest = chest_pose_inv * tracker_local_transform if tracker_local_chest.origin.y > shoulder_y: #print(tracker_local_chest.origin.y - shoulder_y) - skel.set_bone_pose_rotation(shoulder_bone_index, - Quaternion(Vector3(0.0, 0.0, 1.0), (tracker_local_chest.origin.y - shoulder_y) * 2.0 * rotation_scale) * - skel.get_bone_rest(shoulder_bone_index).basis.get_rotation_quaternion()) + var shoulder_rest: Transform3D = skel.get_bone_rest(shoulder_bone_index) + var shoulder_rot_quat: Quaternion = shoulder_rest.basis.get_rotation_quaternion() + skel.set_bone_pose_rotation( + shoulder_bone_index, + Quaternion( + Vector3(0.0, 0.0, 1.0), + (tracker_local_chest.origin.y - shoulder_y) + * 2.0 + * rotation_scale) + * shoulder_rot_quat) var pole_target_y = -y_pole_dist var pole_target_z = -z_pole_dist # Rotate pole target upwards when the arm reaches across the # chest. - if (tracker_local_position.origin.x - base_bone_position.x) * compensation_alpha_scale < 0: - var alpha = -(tracker_local_position.origin.x - base_bone_position.x) * 3.0 * compensation_alpha_scale + if (tracker_local_transform.origin.x - base_bone_position.x) * compensation_alpha_scale < 0: + var alpha = -(tracker_local_transform.origin.x - base_bone_position.x) * 3.0 * compensation_alpha_scale #print(alpha) pole_target_y = lerp(-y_pole_dist, 0.0, alpha) pole_target_z = lerp(-z_pole_dist, 0.0, alpha) @@ -378,7 +412,7 @@ func _process(delta : float) -> void: # Move pole target backwards when the arm is lowered. # # FIXME: Hardcoded values. - var arm_below_factor = (tracker_local_position.origin.y - base_bone_position.y) + 0.25 + var arm_below_factor = (tracker_local_transform.origin.y - base_bone_position.y) + 0.25 arm_below_factor *= 1.0 if arm_below_factor < 0.0: var alpha = arm_below_factor @@ -403,9 +437,10 @@ func _process(delta : float) -> void: # --------------------------------------------------------------------------------------------- # Handle Leaning - var lean_check_axis : Vector3 = (skel.transform * skel.get_bone_global_pose(skel.find_bone("Hips"))).basis * Vector3(1.0, 0.0, 0.0) + var lean_check_axis : Vector3 = (skel.get_bone_global_pose( + skel.find_bone("Hips"))).basis.x lean_check_axis = lean_check_axis.normalized() - var head_offset : Vector3 = tracker_dict["head"]["transform"].origin - model_root.transform.origin + var head_offset : Vector3 = tracker_dict["head"]["transform"].origin var lean_amount : float = sin(lean_check_axis.dot(head_offset)) handle_lean(skel, lean_amount * lean_scale) diff --git a/addons/TwitchGD4 b/addons/TwitchGD4 index ce085939..8a09da5f 160000 --- a/addons/TwitchGD4 +++ b/addons/TwitchGD4 @@ -1 +1 @@ -Subproject commit ce085939f3c27165cc49ddce54706f37c3cd9599 +Subproject commit 8a09da5f485392ce58ad70d8587fdc6b9a65d178 From 958cbd2c143686545fde2ca31affbafb2e44c33e Mon Sep 17 00:00:00 2001 From: pgcomai Date: Mon, 22 Sep 2025 13:36:11 -0700 Subject: [PATCH 02/17] mod compatibility checks --- Core/Main.gd | 2 +- Core/ModelController.gd | 19 +++++++++++++++++++ Mods/Base/Mod_Base.gd | 6 +++++- Mods/MediaPipe/MediaPipeController.gd | 18 +++++++++--------- Mods/PoseIK/PoseIK.gd | 23 ++++++++++++----------- 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/Core/Main.gd b/Core/Main.gd index f0723555..e74a2fc8 100644 --- a/Core/Main.gd +++ b/Core/Main.gd @@ -730,7 +730,7 @@ func reinit_mods(): func get_audio(): return $AudioStreamRecord -func get_controller(): +func get_controller() -> ModelController: return $ModelController ## Get the saved user data directory. When running in the editor, this will be diff --git a/Core/ModelController.gd b/Core/ModelController.gd index 6b992afc..514924f9 100644 --- a/Core/ModelController.gd +++ b/Core/ModelController.gd @@ -3,6 +3,25 @@ class_name ModelController var _last_loaded_vrm = "" +# This is the position the model node is set to each frame. +var model_position := Vector3.ZERO + +# This is a hacky way for PoseIK to move the model based on +# the head position. +var model_head_effect := Vector3.ZERO + +var temp_t: float = 0.0 + +func _process(delta: float) -> void: + get_model().global_position = model_position + model_head_effect + + #test_model_movement(delta) + +## Use this to test 3 axes of model movement. +func test_model_movement(delta: float) -> void: + temp_t += delta + model_position = Vector3(sin(temp_t), cos(temp_t), sin(temp_t)) + func _set_lod_bias_recursively(node): if node is MeshInstance3D: node.lod_bias = 128 diff --git a/Mods/Base/Mod_Base.gd b/Mods/Base/Mod_Base.gd index 52d511fa..a30e276a 100644 --- a/Mods/Base/Mod_Base.gd +++ b/Mods/Base/Mod_Base.gd @@ -384,10 +384,14 @@ func get_skeleton() -> Skeleton3D: # applies to. return get_app().get_skeleton() +## Get the ModelController node. +func get_model_controller() -> ModelController: + return get_app().get_controller() + ## Get the VTuber model in the scene. func get_model() -> Node3D: # FIXME (multiplayer): Return the specific model this applies to. - var controller = get_app().get_node("ModelController") + var controller = get_model_controller() return controller.get_node_or_null("Model") func get_bone_transform(bone_name) -> Transform3D: diff --git a/Mods/MediaPipe/MediaPipeController.gd b/Mods/MediaPipe/MediaPipeController.gd index 68cefe03..e722d09e 100644 --- a/Mods/MediaPipe/MediaPipeController.gd +++ b/Mods/MediaPipe/MediaPipeController.gd @@ -274,14 +274,14 @@ func scene_shutdown(): udp_server.close() udp_server = null - var root = get_skeleton().get_parent() - var left_rest = root.get_node("LeftHandRestReference") - var right_rest = root.get_node("RightHandRestReference") - - root.remove_child(left_rest) - root.remove_child(right_rest) - add_child(left_rest) - add_child(right_rest) + #var root = get_skeleton().get_parent() + #var left_rest = root.get_node("LeftHandRestReference") + #var right_rest = root.get_node("RightHandRestReference") +# + #root.remove_child(left_rest) + #root.remove_child(right_rest) + #add_child(left_rest) + #add_child(right_rest) # Reset pose and blendshapes. get_app().get_controller().reset_skeleton_to_rest_pose() @@ -1068,7 +1068,7 @@ func _update_hand_tracker( # FIXME: Hardcoded values all over this part. # var chest_transform_global_pose = skel.get_bone_global_pose(skel.find_bone("Chest")) - var min_z = (skel.global_transform * chest_transform_global_pose).origin + var min_z = (skel.transform * chest_transform_global_pose).origin if target_origin.z < min_z.z + 0.2: target_origin.z = min_z.z + 0.2 diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index 6532bf67..18573e22 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -238,11 +238,11 @@ func _update_local_trackers() -> void: + model.global_position $Head.global_transform = Transform3D(new_head_basis, - new_head_pos) + new_head_pos) $Hand_Left.global_transform = Transform3D(new_hand_l_basis, - new_hand_l_pos) + new_hand_l_pos) $Hand_Right.global_transform = Transform3D(new_hand_r_basis, - new_hand_r_pos) + new_hand_r_pos) # https://ai.google.dev/edge/mediapipe/solutions/vision/hand_landmarker var mediapipe_hand_landmark_names : Array = [ @@ -298,6 +298,7 @@ func _process(delta : float) -> void: var tracker_dict : Dictionary = get_global_mod_data("trackers") var skel : Skeleton3D = get_skeleton() var model_root : Node3D = get_model() + var model_controller : ModelController = get_model_controller() # --------------------------------------------------------------------------------------------- # Update this mod's tracker instances @@ -321,14 +322,14 @@ func _process(delta : float) -> void: # FIXME: Hack. # This just moves the body based on the head position. - var head_pos = $Head.transform.origin - var model_pos = model_root.transform.origin + var model_head_effect = model_controller.model_head_effect + var head_pos = $Head.transform.origin - model_head_effect if true: # FIXME: ??????? - model_root.transform.origin = model_pos.lerp(head_pos, delta * hip_adjustment_speed) - #model_root.transform.origin = head_pos - #model_root.transform.origin.y = model_y - #model_root.transform.origin.y = lerp(model_pos.y, head_pos.y - 1.9, 0.01) + model_controller.model_head_effect = model_head_effect.lerp(head_pos, delta * hip_adjustment_speed) + #model_controller.model_head_effect = head_pos + #model_controller.model_head_effect.y = model_y + #model_controller.model_head_effect.y = lerp(model_head_effect.y, head_pos.y - 1.9, 0.01) # FIXME: Another hack! var head_rest_transform = get_skeleton().get_bone_global_rest( @@ -337,8 +338,8 @@ func _process(delta : float) -> void: # FIXME: Hard-coded fudge factor. # FIXME: Why can't we just map this directly again? It looks like we're shrugging when the arms get set up wrong or something. - model_root.transform.origin.y = lerp( - model_pos.y, head_pos.y - head_rest_transform.origin.y + head_vertical_offset, + model_controller.model_head_effect.y = lerp( + model_head_effect.y, head_pos.y - head_rest_transform.origin.y + head_vertical_offset, clamp(hips_vertical_blend_speed * delta, 0.0, 1.0)) # --------------------------------------------------------------------- From 77a216fa83b6283e1a70d309789c7f865659ccf1 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Mon, 22 Sep 2025 14:12:07 -0700 Subject: [PATCH 03/17] removed .import files --- Core/UI/Images/icons/128x128.png.import | 34 ----------------------- Core/UI/Images/icons/256x256.png.import | 34 ----------------------- Core/UI/Images/icons/32x32.png.import | 34 ----------------------- Core/UI/Images/icons/512x512.png.import | 34 ----------------------- Core/UI/Images/icons/64x64.png.import | 34 ----------------------- Core/UI/Images/icons/kiri_smug.png.import | 34 ----------------------- Mods/MediaPipe/MediaPipeController.gd | 8 +++++- Mods/PoseIK/PoseIK.gd | 4 ++- 8 files changed, 10 insertions(+), 206 deletions(-) delete mode 100644 Core/UI/Images/icons/128x128.png.import delete mode 100644 Core/UI/Images/icons/256x256.png.import delete mode 100644 Core/UI/Images/icons/32x32.png.import delete mode 100644 Core/UI/Images/icons/512x512.png.import delete mode 100644 Core/UI/Images/icons/64x64.png.import delete mode 100644 Core/UI/Images/icons/kiri_smug.png.import diff --git a/Core/UI/Images/icons/128x128.png.import b/Core/UI/Images/icons/128x128.png.import deleted file mode 100644 index 347f10d4..00000000 --- a/Core/UI/Images/icons/128x128.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://djo6xmxg8hvkx" -path="res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/128x128.png" -dest_files=["res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/256x256.png.import b/Core/UI/Images/icons/256x256.png.import deleted file mode 100644 index f5c9c123..00000000 --- a/Core/UI/Images/icons/256x256.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bhaoj4xliepky" -path="res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/256x256.png" -dest_files=["res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/32x32.png.import b/Core/UI/Images/icons/32x32.png.import deleted file mode 100644 index c0bcc3d1..00000000 --- a/Core/UI/Images/icons/32x32.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://wck0dl8edh62" -path="res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/32x32.png" -dest_files=["res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/512x512.png.import b/Core/UI/Images/icons/512x512.png.import deleted file mode 100644 index 0bde6998..00000000 --- a/Core/UI/Images/icons/512x512.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://4sq74ycyxrje" -path="res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/512x512.png" -dest_files=["res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/64x64.png.import b/Core/UI/Images/icons/64x64.png.import deleted file mode 100644 index 0b6d4e57..00000000 --- a/Core/UI/Images/icons/64x64.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dvb22jyk5x02p" -path="res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/64x64.png" -dest_files=["res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/kiri_smug.png.import b/Core/UI/Images/icons/kiri_smug.png.import deleted file mode 100644 index 776f2b72..00000000 --- a/Core/UI/Images/icons/kiri_smug.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dyy0ftxk42lx7" -path="res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/kiri_smug.png" -dest_files=["res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Mods/MediaPipe/MediaPipeController.gd b/Mods/MediaPipe/MediaPipeController.gd index e722d09e..d3c1e443 100644 --- a/Mods/MediaPipe/MediaPipeController.gd +++ b/Mods/MediaPipe/MediaPipeController.gd @@ -246,7 +246,7 @@ func scene_init(): blend_shape_last_values = {} last_parsed_data = {} - + # Move hand "rest" trackers into the scene. #var root = get_skeleton().get_parent() #var left_rest = $LeftHandRestReference @@ -255,6 +255,9 @@ func scene_init(): #remove_child(right_rest) #root.add_child(left_rest) #root.add_child(right_rest) + + # ^ Commented this stuff out to make it possible to + # move the model node around in global space # Set the head tracker to match the model's head position. var head_bone_index = get_skeleton().find_bone("Head") @@ -282,6 +285,9 @@ func scene_shutdown(): #root.remove_child(right_rest) #add_child(left_rest) #add_child(right_rest) + + # ^ Commented this out because I commented out the code that + # makes this a requirement. # Reset pose and blendshapes. get_app().get_controller().reset_skeleton_to_rest_pose() diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index 18573e22..f999acd1 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -212,9 +212,11 @@ func load_before(_settings_old : Dictionary, _settings_new : Dictionary): func _update_local_trackers() -> void: var tracker_dict : Dictionary = get_global_mod_data("trackers") - + var model = get_model() + # This takes the tracker_dict data and transforms the ik targets + # to be relative to the model node's global position. var new_head_basis: Basis = tracker_dict["head"].transform.basis.rotated( Vector3.UP, model.global_rotation.y) From 8a1c12d8ae1b3888954fc96db3021f841c66f022 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Mon, 22 Sep 2025 14:39:33 -0700 Subject: [PATCH 04/17] made it 6 axis instead of 3 --- Core/ModelController.gd | 12 +++++++----- Mods/PoseIK/PoseIK.gd | 30 ++++++++---------------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/Core/ModelController.gd b/Core/ModelController.gd index 514924f9..0540c71c 100644 --- a/Core/ModelController.gd +++ b/Core/ModelController.gd @@ -3,8 +3,8 @@ class_name ModelController var _last_loaded_vrm = "" -# This is the position the model node is set to each frame. -var model_position := Vector3.ZERO +# This is the transform the model node is set to each frame. +var model_transform := Transform3D.IDENTITY # This is a hacky way for PoseIK to move the model based on # the head position. @@ -13,14 +13,16 @@ var model_head_effect := Vector3.ZERO var temp_t: float = 0.0 func _process(delta: float) -> void: - get_model().global_position = model_position + model_head_effect + get_model().global_transform = model_transform + get_model().global_position += get_model().global_basis * model_head_effect #test_model_movement(delta) -## Use this to test 3 axes of model movement. +## Use this to test 6 axes of model movement. func test_model_movement(delta: float) -> void: temp_t += delta - model_position = Vector3(sin(temp_t), cos(temp_t), sin(temp_t)) + model_transform.origin = Vector3(sin(temp_t), cos(temp_t), sin(temp_t)) + model_transform.basis = Basis.IDENTITY.rotated(Vector3(sin(temp_t), cos(temp_t), sin(temp_t)).normalized(), PI/4.0) func _set_lod_bias_recursively(node): if node is MeshInstance3D: diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index f999acd1..9eb8fe98 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -214,30 +214,16 @@ func _update_local_trackers() -> void: var tracker_dict : Dictionary = get_global_mod_data("trackers") var model = get_model() + var model_up: Vector3 = model.global_basis.y # This takes the tracker_dict data and transforms the ik targets - # to be relative to the model node's global position. - var new_head_basis: Basis = tracker_dict["head"].transform.basis.rotated( - Vector3.UP, - model.global_rotation.y) - var new_head_pos: Vector3 = tracker_dict["head"].transform.origin.rotated( - Vector3.UP, - model.global_rotation.y)\ - + model.global_position - var new_hand_l_basis: Basis = tracker_dict["hand_left"].transform.basis.rotated( - Vector3.UP, - model.global_rotation.y) - var new_hand_l_pos: Vector3 = tracker_dict["hand_left"].transform.origin.rotated( - Vector3.UP, - model.global_rotation.y)\ - + model.global_position - var new_hand_r_basis: Basis = tracker_dict["hand_right"].transform.basis.rotated( - Vector3.UP, - model.global_rotation.y) - var new_hand_r_pos: Vector3 = tracker_dict["hand_right"].transform.origin.rotated( - Vector3.UP, - model.global_rotation.y)\ - + model.global_position + # to be relative to the model node's global transform. + var new_head_basis: Basis = tracker_dict["head"].transform.basis * model.global_basis + var new_head_pos: Vector3 = (model.global_basis * tracker_dict["head"].transform.origin) + model.global_position + var new_hand_l_basis: Basis = tracker_dict["hand_left"].transform.basis * model.global_basis + var new_hand_l_pos: Vector3 = (model.global_basis * tracker_dict["hand_left"].transform.origin) + model.global_position + var new_hand_r_basis: Basis = tracker_dict["hand_right"].transform.basis * model.global_basis + var new_hand_r_pos: Vector3 = (model.global_basis * tracker_dict["hand_right"].transform.origin) + model.global_position $Head.global_transform = Transform3D(new_head_basis, new_head_pos) From b2c51b97448cceebe3f1059355506ac05611c3db Mon Sep 17 00:00:00 2001 From: pgcomai Date: Tue, 23 Sep 2025 10:16:08 -0700 Subject: [PATCH 05/17] fixed nags and other issues --- Core/ModelController.gd | 10 ------ Core/UI/Images/icons/128x128.png.import | 34 ++++++++++++++++++ Core/UI/Images/icons/256x256.png.import | 34 ++++++++++++++++++ Core/UI/Images/icons/32x32.png.import | 34 ++++++++++++++++++ Core/UI/Images/icons/512x512.png.import | 34 ++++++++++++++++++ Core/UI/Images/icons/64x64.png.import | 34 ++++++++++++++++++ Core/UI/Images/icons/kiri_smug.png.import | 34 ++++++++++++++++++ Mods/MediaPipe/MediaPipeController.gd | 6 ++-- .../ModelMovementTester.gd | 35 +++++++++++++++++++ .../ModelMovementTester.gd.uid | 1 + .../ModelMovementTester.tscn | 6 ++++ Mods/ModelMovementTester/description.txt | 1 + Mods/PoseIK/PoseIK.gd | 9 ++--- 13 files changed, 253 insertions(+), 19 deletions(-) create mode 100644 Core/UI/Images/icons/128x128.png.import create mode 100644 Core/UI/Images/icons/256x256.png.import create mode 100644 Core/UI/Images/icons/32x32.png.import create mode 100644 Core/UI/Images/icons/512x512.png.import create mode 100644 Core/UI/Images/icons/64x64.png.import create mode 100644 Core/UI/Images/icons/kiri_smug.png.import create mode 100644 Mods/ModelMovementTester/ModelMovementTester.gd create mode 100644 Mods/ModelMovementTester/ModelMovementTester.gd.uid create mode 100644 Mods/ModelMovementTester/ModelMovementTester.tscn create mode 100644 Mods/ModelMovementTester/description.txt diff --git a/Core/ModelController.gd b/Core/ModelController.gd index 0540c71c..cbd6a855 100644 --- a/Core/ModelController.gd +++ b/Core/ModelController.gd @@ -10,19 +10,9 @@ var model_transform := Transform3D.IDENTITY # the head position. var model_head_effect := Vector3.ZERO -var temp_t: float = 0.0 - func _process(delta: float) -> void: get_model().global_transform = model_transform get_model().global_position += get_model().global_basis * model_head_effect - - #test_model_movement(delta) - -## Use this to test 6 axes of model movement. -func test_model_movement(delta: float) -> void: - temp_t += delta - model_transform.origin = Vector3(sin(temp_t), cos(temp_t), sin(temp_t)) - model_transform.basis = Basis.IDENTITY.rotated(Vector3(sin(temp_t), cos(temp_t), sin(temp_t)).normalized(), PI/4.0) func _set_lod_bias_recursively(node): if node is MeshInstance3D: diff --git a/Core/UI/Images/icons/128x128.png.import b/Core/UI/Images/icons/128x128.png.import new file mode 100644 index 00000000..86ba3172 --- /dev/null +++ b/Core/UI/Images/icons/128x128.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dwkmjr3rdeqju" +path="res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/128x128.png" +dest_files=["res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/256x256.png.import b/Core/UI/Images/icons/256x256.png.import new file mode 100644 index 00000000..5fc51e56 --- /dev/null +++ b/Core/UI/Images/icons/256x256.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dj2k1lvx7bd8d" +path="res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/256x256.png" +dest_files=["res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/32x32.png.import b/Core/UI/Images/icons/32x32.png.import new file mode 100644 index 00000000..d0191f63 --- /dev/null +++ b/Core/UI/Images/icons/32x32.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b2ywosi47fbck" +path="res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/32x32.png" +dest_files=["res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/512x512.png.import b/Core/UI/Images/icons/512x512.png.import new file mode 100644 index 00000000..7caba74b --- /dev/null +++ b/Core/UI/Images/icons/512x512.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://djrcigvmklw2b" +path="res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/512x512.png" +dest_files=["res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/64x64.png.import b/Core/UI/Images/icons/64x64.png.import new file mode 100644 index 00000000..269dd634 --- /dev/null +++ b/Core/UI/Images/icons/64x64.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ev7qfco7a6hm" +path="res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/64x64.png" +dest_files=["res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/kiri_smug.png.import b/Core/UI/Images/icons/kiri_smug.png.import new file mode 100644 index 00000000..4680482e --- /dev/null +++ b/Core/UI/Images/icons/kiri_smug.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bri7q3fo0pbho" +path="res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Core/UI/Images/icons/kiri_smug.png" +dest_files=["res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Mods/MediaPipe/MediaPipeController.gd b/Mods/MediaPipe/MediaPipeController.gd index d3c1e443..251451d5 100644 --- a/Mods/MediaPipe/MediaPipeController.gd +++ b/Mods/MediaPipe/MediaPipeController.gd @@ -246,7 +246,7 @@ func scene_init(): blend_shape_last_values = {} last_parsed_data = {} - + # Move hand "rest" trackers into the scene. #var root = get_skeleton().get_parent() #var left_rest = $LeftHandRestReference @@ -280,12 +280,12 @@ func scene_shutdown(): #var root = get_skeleton().get_parent() #var left_rest = root.get_node("LeftHandRestReference") #var right_rest = root.get_node("RightHandRestReference") -# + # #root.remove_child(left_rest) #root.remove_child(right_rest) #add_child(left_rest) #add_child(right_rest) - + # ^ Commented this out because I commented out the code that # makes this a requirement. diff --git a/Mods/ModelMovementTester/ModelMovementTester.gd b/Mods/ModelMovementTester/ModelMovementTester.gd new file mode 100644 index 00000000..10672b5c --- /dev/null +++ b/Mods/ModelMovementTester/ModelMovementTester.gd @@ -0,0 +1,35 @@ +extends Mod_Base +class_name Mod_ModelMovementTester + +var test_movement := false + +var t: float = 0.0 + +func _ready() -> void: + add_tracked_setting( + "test_movement", + "Test Movement") + +func scene_shutdown() -> void: + var controller := get_model_controller() + + controller.model_transform.origin = Vector3.ZERO + controller.model_transform.basis = Basis.IDENTITY + +func _process(delta: float) -> void: + if test_movement: + test_model_movement(delta) + +## Use this to test 6 axes of model movement. +func test_model_movement(delta: float) -> void: + var controller := get_model_controller() + + t += delta + controller.model_transform.origin = Vector3(sin(t), + cos(t), + sin(t)) + controller.model_transform.basis = Basis.IDENTITY.rotated( + Vector3(sin(t), + cos(t), + sin(t)).normalized(), + PI/4.0) diff --git a/Mods/ModelMovementTester/ModelMovementTester.gd.uid b/Mods/ModelMovementTester/ModelMovementTester.gd.uid new file mode 100644 index 00000000..3f36cdac --- /dev/null +++ b/Mods/ModelMovementTester/ModelMovementTester.gd.uid @@ -0,0 +1 @@ +uid://chv81bhj12v5n diff --git a/Mods/ModelMovementTester/ModelMovementTester.tscn b/Mods/ModelMovementTester/ModelMovementTester.tscn new file mode 100644 index 00000000..809c4a42 --- /dev/null +++ b/Mods/ModelMovementTester/ModelMovementTester.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=3 uid="uid://bkc4rcnv5na3n"] + +[ext_resource type="Script" uid="uid://chv81bhj12v5n" path="res://Mods/ModelMovementTester/ModelMovementTester.gd" id="1_yike5"] + +[node name="ModelMovementTester" type="Node"] +script = ExtResource("1_yike5") diff --git a/Mods/ModelMovementTester/description.txt b/Mods/ModelMovementTester/description.txt new file mode 100644 index 00000000..0d0edd30 --- /dev/null +++ b/Mods/ModelMovementTester/description.txt @@ -0,0 +1 @@ +Moves and rotates the model for debugging purposes. diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index 9eb8fe98..ab09fe5e 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -225,12 +225,9 @@ func _update_local_trackers() -> void: var new_hand_r_basis: Basis = tracker_dict["hand_right"].transform.basis * model.global_basis var new_hand_r_pos: Vector3 = (model.global_basis * tracker_dict["hand_right"].transform.origin) + model.global_position - $Head.global_transform = Transform3D(new_head_basis, - new_head_pos) - $Hand_Left.global_transform = Transform3D(new_hand_l_basis, - new_hand_l_pos) - $Hand_Right.global_transform = Transform3D(new_hand_r_basis, - new_hand_r_pos) + $Head.global_transform = Transform3D(new_head_basis, new_head_pos) + $Hand_Left.global_transform = Transform3D(new_hand_l_basis, new_hand_l_pos) + $Hand_Right.global_transform = Transform3D(new_hand_r_basis, new_hand_r_pos) # https://ai.google.dev/edge/mediapipe/solutions/vision/hand_landmarker var mediapipe_hand_landmark_names : Array = [ From da9f4ef976aa9cf9bbd36225adb26460a2a0c218 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Tue, 23 Sep 2025 10:16:50 -0700 Subject: [PATCH 06/17] i keep forgetting to delete the .import files --- Core/UI/Images/icons/128x128.png.import | 34 ----------------------- Core/UI/Images/icons/256x256.png.import | 34 ----------------------- Core/UI/Images/icons/32x32.png.import | 34 ----------------------- Core/UI/Images/icons/512x512.png.import | 34 ----------------------- Core/UI/Images/icons/64x64.png.import | 34 ----------------------- Core/UI/Images/icons/kiri_smug.png.import | 34 ----------------------- 6 files changed, 204 deletions(-) delete mode 100644 Core/UI/Images/icons/128x128.png.import delete mode 100644 Core/UI/Images/icons/256x256.png.import delete mode 100644 Core/UI/Images/icons/32x32.png.import delete mode 100644 Core/UI/Images/icons/512x512.png.import delete mode 100644 Core/UI/Images/icons/64x64.png.import delete mode 100644 Core/UI/Images/icons/kiri_smug.png.import diff --git a/Core/UI/Images/icons/128x128.png.import b/Core/UI/Images/icons/128x128.png.import deleted file mode 100644 index 86ba3172..00000000 --- a/Core/UI/Images/icons/128x128.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dwkmjr3rdeqju" -path="res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/128x128.png" -dest_files=["res://.godot/imported/128x128.png-31ae4581b999cf60f2954586d4069f86.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/256x256.png.import b/Core/UI/Images/icons/256x256.png.import deleted file mode 100644 index 5fc51e56..00000000 --- a/Core/UI/Images/icons/256x256.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dj2k1lvx7bd8d" -path="res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/256x256.png" -dest_files=["res://.godot/imported/256x256.png-6916b985d94099b77ac42d36080376ba.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/32x32.png.import b/Core/UI/Images/icons/32x32.png.import deleted file mode 100644 index d0191f63..00000000 --- a/Core/UI/Images/icons/32x32.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://b2ywosi47fbck" -path="res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/32x32.png" -dest_files=["res://.godot/imported/32x32.png-5f12de92c4d8e5921e5503736b7e6f08.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/512x512.png.import b/Core/UI/Images/icons/512x512.png.import deleted file mode 100644 index 7caba74b..00000000 --- a/Core/UI/Images/icons/512x512.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://djrcigvmklw2b" -path="res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/512x512.png" -dest_files=["res://.godot/imported/512x512.png-68603e2c8eb4bd21639a3a45e1c5b7d0.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/64x64.png.import b/Core/UI/Images/icons/64x64.png.import deleted file mode 100644 index 269dd634..00000000 --- a/Core/UI/Images/icons/64x64.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://ev7qfco7a6hm" -path="res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/64x64.png" -dest_files=["res://.godot/imported/64x64.png-d809fa47d8c0840d02088b721d5fb71d.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/Core/UI/Images/icons/kiri_smug.png.import b/Core/UI/Images/icons/kiri_smug.png.import deleted file mode 100644 index 4680482e..00000000 --- a/Core/UI/Images/icons/kiri_smug.png.import +++ /dev/null @@ -1,34 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bri7q3fo0pbho" -path="res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://Core/UI/Images/icons/kiri_smug.png" -dest_files=["res://.godot/imported/kiri_smug.png-3779d780d643bd959b80f9294c1515ce.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 From 67810af3e625ca666f25e18bb3e2fbdee9dc102e Mon Sep 17 00:00:00 2001 From: pgcomai Date: Tue, 23 Sep 2025 10:19:49 -0700 Subject: [PATCH 07/17] forgot the := thing --- Mods/ModelMovementTester/ModelMovementTester.gd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mods/ModelMovementTester/ModelMovementTester.gd b/Mods/ModelMovementTester/ModelMovementTester.gd index 10672b5c..85689710 100644 --- a/Mods/ModelMovementTester/ModelMovementTester.gd +++ b/Mods/ModelMovementTester/ModelMovementTester.gd @@ -3,7 +3,7 @@ class_name Mod_ModelMovementTester var test_movement := false -var t: float = 0.0 +var t := 0.0 func _ready() -> void: add_tracked_setting( From 981cc2f031592f89aed71ae7359b4dd755324c24 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Tue, 23 Sep 2025 12:25:28 -0700 Subject: [PATCH 08/17] put TwitchGD4 on correct commit --- addons/TwitchGD4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/TwitchGD4 b/addons/TwitchGD4 index 8a09da5f..c08eadf3 160000 --- a/addons/TwitchGD4 +++ b/addons/TwitchGD4 @@ -1 +1 @@ -Subproject commit 8a09da5f485392ce58ad70d8587fdc6b9a65d178 +Subproject commit c08eadf32c1cc5f52dbb035d44b2a21f1b9924df From e7d1de4d4f92c46f5ef80da21e1ed31f77b4550e Mon Sep 17 00:00:00 2001 From: pgcomai Date: Tue, 23 Sep 2025 12:31:04 -0700 Subject: [PATCH 09/17] TwitchGD4 uids --- project.godot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.godot b/project.godot index 54b42a82..7ae3e2f9 100644 --- a/project.godot +++ b/project.godot @@ -10,7 +10,7 @@ config_version=5 [application] -config/name="SnekStudio" +config/name="SnekStudioTesting" config/version="0.1.5" run/main_scene="res://Core/Main.tscn" config/use_custom_user_dir=true From 87fb1cb50c2fc3e464d10ad88bcf9b40f0ed98d8 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Tue, 23 Sep 2025 12:33:19 -0700 Subject: [PATCH 10/17] borked project name --- project.godot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.godot b/project.godot index 7ae3e2f9..54b42a82 100644 --- a/project.godot +++ b/project.godot @@ -10,7 +10,7 @@ config_version=5 [application] -config/name="SnekStudioTesting" +config/name="SnekStudio" config/version="0.1.5" run/main_scene="res://Core/Main.tscn" config/use_custom_user_dir=true From c1256e0a21f69886553abd6d8b0aea82221065f1 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Tue, 23 Sep 2025 12:39:42 -0700 Subject: [PATCH 11/17] TwitchGD4 correct commit for real this time --- addons/TwitchGD4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/TwitchGD4 b/addons/TwitchGD4 index c08eadf3..ce085939 160000 --- a/addons/TwitchGD4 +++ b/addons/TwitchGD4 @@ -1 +1 @@ -Subproject commit c08eadf32c1cc5f52dbb035d44b2a21f1b9924df +Subproject commit ce085939f3c27165cc49ddce54706f37c3cd9599 From c5d8de232538b1739f291a9c0d7ecdb09539a2b7 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Wed, 24 Sep 2025 10:26:49 -0700 Subject: [PATCH 12/17] switched to node transforms --- Core/ModelController.gd | 11 ----------- Mods/ModelMovementTester/ModelMovementTester.gd | 8 ++++---- Mods/PoseIK/PoseIK.gd | 9 ++++----- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/Core/ModelController.gd b/Core/ModelController.gd index cbd6a855..6b992afc 100644 --- a/Core/ModelController.gd +++ b/Core/ModelController.gd @@ -3,17 +3,6 @@ class_name ModelController var _last_loaded_vrm = "" -# This is the transform the model node is set to each frame. -var model_transform := Transform3D.IDENTITY - -# This is a hacky way for PoseIK to move the model based on -# the head position. -var model_head_effect := Vector3.ZERO - -func _process(delta: float) -> void: - get_model().global_transform = model_transform - get_model().global_position += get_model().global_basis * model_head_effect - func _set_lod_bias_recursively(node): if node is MeshInstance3D: node.lod_bias = 128 diff --git a/Mods/ModelMovementTester/ModelMovementTester.gd b/Mods/ModelMovementTester/ModelMovementTester.gd index 85689710..9384045f 100644 --- a/Mods/ModelMovementTester/ModelMovementTester.gd +++ b/Mods/ModelMovementTester/ModelMovementTester.gd @@ -13,8 +13,8 @@ func _ready() -> void: func scene_shutdown() -> void: var controller := get_model_controller() - controller.model_transform.origin = Vector3.ZERO - controller.model_transform.basis = Basis.IDENTITY + controller.global_transform.origin = Vector3.ZERO + controller.global_transform.basis = Basis.IDENTITY func _process(delta: float) -> void: if test_movement: @@ -25,10 +25,10 @@ func test_model_movement(delta: float) -> void: var controller := get_model_controller() t += delta - controller.model_transform.origin = Vector3(sin(t), + controller.global_transform.origin = Vector3(sin(t), cos(t), sin(t)) - controller.model_transform.basis = Basis.IDENTITY.rotated( + controller.global_transform.basis = Basis.IDENTITY.rotated( Vector3(sin(t), cos(t), sin(t)).normalized(), diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index ab09fe5e..06e98daa 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -307,11 +307,10 @@ func _process(delta : float) -> void: # FIXME: Hack. # This just moves the body based on the head position. - var model_head_effect = model_controller.model_head_effect - var head_pos = $Head.transform.origin - model_head_effect + var head_pos = $Head.transform.origin - model_root.position if true: # FIXME: ??????? - model_controller.model_head_effect = model_head_effect.lerp(head_pos, delta * hip_adjustment_speed) + model_root.position = model_root.position.lerp(head_pos, delta * hip_adjustment_speed) #model_controller.model_head_effect = head_pos #model_controller.model_head_effect.y = model_y #model_controller.model_head_effect.y = lerp(model_head_effect.y, head_pos.y - 1.9, 0.01) @@ -323,8 +322,8 @@ func _process(delta : float) -> void: # FIXME: Hard-coded fudge factor. # FIXME: Why can't we just map this directly again? It looks like we're shrugging when the arms get set up wrong or something. - model_controller.model_head_effect.y = lerp( - model_head_effect.y, head_pos.y - head_rest_transform.origin.y + head_vertical_offset, + model_root.position.y = lerp( + model_root.position.y, head_pos.y - head_rest_transform.origin.y + head_vertical_offset, clamp(hips_vertical_blend_speed * delta, 0.0, 1.0)) # --------------------------------------------------------------------- From ebc808443cf777c51a9a9236ef480c5b32807d74 Mon Sep 17 00:00:00 2001 From: pgcomai Date: Wed, 24 Sep 2025 10:39:40 -0700 Subject: [PATCH 13/17] head height offset fix --- Mods/ModelMovementTester/ModelMovementTester.gd | 8 +++++++- Mods/PoseIK/PoseIK.gd | 5 ++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Mods/ModelMovementTester/ModelMovementTester.gd b/Mods/ModelMovementTester/ModelMovementTester.gd index 9384045f..47e275a2 100644 --- a/Mods/ModelMovementTester/ModelMovementTester.gd +++ b/Mods/ModelMovementTester/ModelMovementTester.gd @@ -5,20 +5,26 @@ var test_movement := false var t := 0.0 +var movement_speed := 1.0 + func _ready() -> void: add_tracked_setting( "test_movement", "Test Movement") + add_tracked_setting( + "movement_speed", "Movement Speed", + { "min" : 0.1, "max" : 2.0 }) func scene_shutdown() -> void: var controller := get_model_controller() + # Throws errors when closing app controller.global_transform.origin = Vector3.ZERO controller.global_transform.basis = Basis.IDENTITY func _process(delta: float) -> void: if test_movement: - test_model_movement(delta) + test_model_movement(delta * movement_speed) ## Use this to test 6 axes of model movement. func test_model_movement(delta: float) -> void: diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index 06e98daa..f1c2c7af 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -307,7 +307,10 @@ func _process(delta : float) -> void: # FIXME: Hack. # This just moves the body based on the head position. - var head_pos = $Head.transform.origin - model_root.position + var head_pos = $Head.transform.origin - model_root.position + (model_root.global_basis * Vector3( + 0.0, + head_vertical_offset, + 0.0)) if true: # FIXME: ??????? model_root.position = model_root.position.lerp(head_pos, delta * hip_adjustment_speed) From 2123d566f54b6f6f5756baedaec8b5f4d120eabf Mon Sep 17 00:00:00 2001 From: pgcomai Date: Wed, 24 Sep 2025 10:59:52 -0700 Subject: [PATCH 14/17] updated commented-out code --- Mods/PoseIK/PoseIK.gd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index f1c2c7af..20ad9500 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -314,9 +314,9 @@ func _process(delta : float) -> void: if true: # FIXME: ??????? model_root.position = model_root.position.lerp(head_pos, delta * hip_adjustment_speed) - #model_controller.model_head_effect = head_pos - #model_controller.model_head_effect.y = model_y - #model_controller.model_head_effect.y = lerp(model_head_effect.y, head_pos.y - 1.9, 0.01) + #model_root.position = head_pos + #model_root.position.y = model_y + #model_root.position.y = lerp(model_head_effect.y, head_pos.y - 1.9, 0.01) # FIXME: Another hack! var head_rest_transform = get_skeleton().get_bone_global_rest( From ca0dde61f703d74653317881e2ce4fd2509cab1b Mon Sep 17 00:00:00 2001 From: pgcomai Date: Fri, 26 Sep 2025 13:58:14 -0700 Subject: [PATCH 15/17] changed mod to node3d --- Mods/ModelMovementTester/ModelMovementTester.tscn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mods/ModelMovementTester/ModelMovementTester.tscn b/Mods/ModelMovementTester/ModelMovementTester.tscn index 809c4a42..23f21360 100644 --- a/Mods/ModelMovementTester/ModelMovementTester.tscn +++ b/Mods/ModelMovementTester/ModelMovementTester.tscn @@ -2,5 +2,5 @@ [ext_resource type="Script" uid="uid://chv81bhj12v5n" path="res://Mods/ModelMovementTester/ModelMovementTester.gd" id="1_yike5"] -[node name="ModelMovementTester" type="Node"] +[node name="ModelMovementTester" type="Node3D"] script = ExtResource("1_yike5") From 36495c1c5822677ff2497c81fa6d9b7f7399806a Mon Sep 17 00:00:00 2001 From: pgcomai Date: Thu, 20 Nov 2025 10:54:02 -0800 Subject: [PATCH 16/17] turns out it didnt work but now it does --- Core/ModelController.gd | 2 +- Mods/ModelMovementTester/ModelMovementTester.gd | 12 ++++++------ Mods/PoseIK/PoseIK.gd | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Core/ModelController.gd b/Core/ModelController.gd index 6b992afc..f58de0b1 100644 --- a/Core/ModelController.gd +++ b/Core/ModelController.gd @@ -80,7 +80,7 @@ func get_skeleton() -> Skeleton3D: return null # Try to find the skeleton on the secondary object first. - var secondary = $Model.get_node("secondary") + var secondary = $Model.get_node_or_null("secondary") if secondary: if secondary is VRMSecondary: var skeleton2 : Skeleton3D = secondary.get_node(secondary.skeleton) diff --git a/Mods/ModelMovementTester/ModelMovementTester.gd b/Mods/ModelMovementTester/ModelMovementTester.gd index 47e275a2..d5521e16 100644 --- a/Mods/ModelMovementTester/ModelMovementTester.gd +++ b/Mods/ModelMovementTester/ModelMovementTester.gd @@ -31,11 +31,11 @@ func test_model_movement(delta: float) -> void: var controller := get_model_controller() t += delta - controller.global_transform.origin = Vector3(sin(t), - cos(t), - sin(t)) + controller.global_transform.origin = Vector3(sin(t) * 0.5, + cos(t) * 0.5, + sin(t) * 0.5) controller.global_transform.basis = Basis.IDENTITY.rotated( - Vector3(sin(t), - cos(t), - sin(t)).normalized(), + Vector3(sin(t) * 2.0, + cos(t) * 2.0, + sin(t) * 2.0).normalized(), PI/4.0) diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index 20ad9500..c904ae69 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -218,11 +218,11 @@ func _update_local_trackers() -> void: # This takes the tracker_dict data and transforms the ik targets # to be relative to the model node's global transform. - var new_head_basis: Basis = tracker_dict["head"].transform.basis * model.global_basis + var new_head_basis: Basis = model.global_basis * tracker_dict["head"].transform.basis var new_head_pos: Vector3 = (model.global_basis * tracker_dict["head"].transform.origin) + model.global_position - var new_hand_l_basis: Basis = tracker_dict["hand_left"].transform.basis * model.global_basis + var new_hand_l_basis: Basis = model.global_basis * tracker_dict["hand_left"].transform.basis var new_hand_l_pos: Vector3 = (model.global_basis * tracker_dict["hand_left"].transform.origin) + model.global_position - var new_hand_r_basis: Basis = tracker_dict["hand_right"].transform.basis * model.global_basis + var new_hand_r_basis: Basis = model.global_basis * tracker_dict["hand_right"].transform.basis var new_hand_r_pos: Vector3 = (model.global_basis * tracker_dict["hand_right"].transform.origin) + model.global_position $Head.global_transform = Transform3D(new_head_basis, new_head_pos) From cd65fec493039270c04fb38b9482988153fe935c Mon Sep 17 00:00:00 2001 From: pgcomai Date: Thu, 20 Nov 2025 11:17:01 -0800 Subject: [PATCH 17/17] fixed it even more --- Mods/PoseIK/PoseIK.gd | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/Mods/PoseIK/PoseIK.gd b/Mods/PoseIK/PoseIK.gd index c904ae69..a4563094 100644 --- a/Mods/PoseIK/PoseIK.gd +++ b/Mods/PoseIK/PoseIK.gd @@ -307,10 +307,13 @@ func _process(delta : float) -> void: # FIXME: Hack. # This just moves the body based on the head position. - var head_pos = $Head.transform.origin - model_root.position + (model_root.global_basis * Vector3( - 0.0, - head_vertical_offset, - 0.0)) + var head_tracker_local: Vector3 = model_controller.to_local($Head.transform.origin) + var head_offset_global: Vector3 = model_root.global_basis * Vector3( + 0.0, + head_vertical_offset, + 0.0 + ) + var head_pos = head_tracker_local - model_root.position + head_offset_global if true: # FIXME: ??????? model_root.position = model_root.position.lerp(head_pos, delta * hip_adjustment_speed)