Unable to deform mesh with SkeletonIK

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

Morning all

I am stuck at making IK work through script. Hoping for some help. I will include the script and the order of nodes below.

FPS[Spatial]
	-Armature[Spatial]
		-Skeleton
			-FPS Mesh
			-SkeletonIK
			-Target[Spatial]
		-AnimationPlayer
	

I tried the https://www.youtube.com/watch?v=TfAO2W6lO8E by RandomMomentania and Skeleton Inverse Kinematic - Godot 3.1 by Andrea Catania.

I can make the mesh deform by manually moving the target in the editor. However - I am hoping to make it happen through script so that I can either move the target in the script
or change the target_node of IK during runtime, to help with picking a different weapon and having the hands moving to new holding location based on the weapon. However, when I try to change the target node or when I move the current target_node either by changing global_transform or global_transform.origin - no mesh deform happens. I can still play the animation and that works as expected.

What am I doing wrong?

extends Spatial


onready var iktarg=$Armature/Skeleton/target_1

func _input(event):
	if Input.is_key_pressed(KEY_UP):
		iktarg.global_transform.origin.y+=0.1
	elif Input.is_key_pressed(KEY_DOWN):
		iktarg.global_transform.origin.y-=0.1
		
	print(iktarg.global_transform.origin)

	if Input.is_key_pressed(KEY_SPACE):
		$AnimationPlayer.play("push")

Thanks all

Not to answer my own question but the SkeletonIK needs to be started and then run when modified in code. At least that helped my situation. In the following code, I have Skeleton with SkeletonIK and two spatials P1 and P2 as it’s children.
Hope this helps someone

extends Spatial

var cur=1


func _ready():
	$Armature/Skeleton/SkeletonIK.start(true)


func _input(event):
	if Input.is_key_pressed(KEY_SPACE) and not event.is_echo():
		if cur==1:
			$Armature/Skeleton/SkeletonIK.set_target_node($Armature/Skeleton/p1.get_path())
			$Armature/Skeleton/SkeletonIK.start(true)
			cur=2 
		else:
			$Armature/Skeleton/SkeletonIK.set_target_node($Armature/Skeleton/p2.get_path())
			$Armature/Skeleton/SkeletonIK.start(true)
			cur=1
			

sxkod | 2020-10-07 14:56