Hi again @TwistedTwigleg ,
Sorry for delay, but I was testing all the possible ways to make it work and it took so much time.
Anyways, there are some real problems with location(origin) of rotation and parenting that I couldn't solve it.
In this video I tried to move Arm and Forearm separately, as you can see rotation origin is (0,0,0) and when the arm is moving the forearm should move with that but it's not.
Here is the script, q variables are the Quaternion data which I'm getting from IMU sensors:
extends Skeleton
var loadedScript = load("res://Model/metarig.py")
var loadedScriptInstance = loadedScript.new()
var bone_node : Spatial
var bone_node_2 : Spatial
var bone_id_to_manipulate = 8
var bone_id_to_manipulate_2 = 9
var is_bone_overridden = false
var q0=0
var q1=0
var q2=0
var q3=0
var q4=0
var q5=0
var q6=0
var q7=0
var trans
var trans2
func _ready():
# bone_node = get_node("bone_node")
# bone_node_2 = get_node("bone_node_2")
start_bone_override()
func start_bone_override():
is_bone_overridden = true
func update_bone_override():
# if we are overriding the bone pose...
if is_bone_overridden == true:
# set's the bone override transform
set_bone_global_pose_override(bone_id_to_manipulate, trans, 1.0, true);
set_bone_global_pose_override(bone_id_to_manipulate_2, trans2, 1.0, true);
func stop_bone_override():
# stop overriding the bone pose every _process call
is_bone_overridden = false
# reset the bone pose
set_bone_global_pose_override(bone_id_to_manipulate, Transform(), 0.0, false)
set_bone_global_pose_override(bone_id_to_manipulate_2, Transform(), 0.0, false)
func _process(_delta):
var dataPacket = loadedScriptInstance.myProcess()
var splitPacket=dataPacket.split(',')
q0 = splitPacket[0]
q1 = splitPacket[1]
q2 = splitPacket[2]
q3 = splitPacket[3]
q4 = splitPacket[4]
q5 = splitPacket[5]
q6 = splitPacket[6]
q7 = splitPacket[7]
q0 = float(q0)
q1 = float(q1)
q2 = float(q2)
q3 = float(q3)
q4 = float(q4)
q5 = float(q5)
q6 = float(q6)
q7 = float(q7)
quat_transform(q1, q2, q3, q0)
quat_transform2(q5, q6, q7, q4)
update_bone_override()
func quat_transform(x, y, z, w):
#var bone_trans = $"Physical Bone Bone".get_transform()
var bone_trans = $"Physical Bone shoulderL/Physical Bone upper_armL".get_transform()
var myRot = Quat(x, y, z, w)
var myBasis = Basis(myRot)
# then you can just set the basis property of the bone trans
bone_trans.basis = myBasis;
trans = Transform ( myBasis )
# or return a transform with the desired rotation instead
# var return_trans = bone_trans.duplicate()
# return_trans.basis = myBasis;
# return return_trans;
func quat_transform2(x, y, z, w):
#var bone_trans = $"Physical Bone Bone".get_transform()
var bone_trans2 = $"Physical Bone shoulderL/Physical Bone upper_armL/Physical Bone forearmL".get_transform()
var myRot2 = Quat(x, y, z, w)
var myBasis2 = Basis(myRot2)
# then you can just set the basis property of the bone trans
bone_trans2.basis = myBasis2;
trans2 = Transform ( myBasis2 )
# or return a transform with the desired rotation instead
# var return_trans = bone_trans.duplicate()
# return_trans.basis = myBasis;
# return return_trans;
also I did tried the same process for a simple cube and here is the result:

The length of the cube is enough to cover the space between two black blocks, but it gets short when I'm trying to move it also as you can see deformation of mesh is not good at all because it seems a part of a cube is shifted inside.
Thanks again for your attention.
Kind Regards,
Mason