extends SceneTree ## What units does the imported arms rig actually live in? The Blender side reports bone ## lengths in centimetres but a metre-scale mesh AABB, so measure it in-engine with the ## scene actually in a tree (skinned AABBs are meaningless before that). func _initialize() -> void: var root := Node3D.new() get_root().add_child(root) var ps := load("res://assets/viewmodel/fps_arms.glb") as PackedScene var inst: Node3D = ps.instantiate() root.add_child(inst) print("inst.transform = ", inst.transform) for c in inst.get_children(): print(" child ", c.name, " <", c.get_class(), "> xform=", (c as Node3D).transform) var skel := _skel(inst) print("skel.transform = ", skel.transform) print("skel global (rel inst) = ", inst.global_transform.affine_inverse() * skel.global_transform) for n in ["mixamorig_RightHand", "mixamorig_RightForeArm", "mixamorig_RightHandIndex1"]: var i := skel.find_bone(n) print("%-30s global_rest.origin = %s" % [n, skel.get_bone_global_rest(i).origin]) var hr := skel.find_bone("mixamorig_RightHand") var fa := skel.find_bone("mixamorig_RightForeArm") var forearm_len: float = (skel.get_bone_global_rest(hr).origin - skel.get_bone_global_rest(fa).origin).length() print("forearm length (skeleton units) = ", forearm_len) for mi in _meshes(inst): var m := mi as MeshInstance3D print("mesh %-16s local aabb=%s global aabb size=%s" % [ m.name, m.get_aabb().size, m.get_global_transform().basis * m.get_aabb().size]) quit() func _skel(n: Node) -> Skeleton3D: if n is Skeleton3D: return n for c in n.get_children(): var r := _skel(c) if r != null: return r return null func _meshes(n: Node, acc: Array = []) -> Array: if n is MeshInstance3D: acc.append(n) for c in n.get_children(): _meshes(c, acc) return acc