diff --git a/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend b/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend index 5bf1d2e..37fe387 100644 Binary files a/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend and b/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend differ diff --git a/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend1 b/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend1 index 17f3473..5bf1d2e 100644 Binary files a/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend1 and b/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian.blend1 differ diff --git a/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian_rev2.blend b/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian_rev2.blend new file mode 100644 index 0000000..61a211e Binary files /dev/null and b/GodotXRIKRig/addons/godot-xr-ik-rig/assets/barbarian_rev2.blend differ diff --git a/GodotXRIKRig/addons/godot-xr-ik-rig/scenes/PlayerIKRig.gd b/GodotXRIKRig/addons/godot-xr-ik-rig/scenes/PlayerIKRig.gd index 71deda1..c62bf92 100644 --- a/GodotXRIKRig/addons/godot-xr-ik-rig/scenes/PlayerIKRig.gd +++ b/GodotXRIKRig/addons/godot-xr-ik-rig/scenes/PlayerIKRig.gd @@ -11,8 +11,21 @@ onready var skel = $Character/Rig/Skeleton func _ready(): var idx_upperarm_l = skel.find_bone("upperarm.l") var idx_lowerarm_l = skel.find_bone("lowerarm.l") - skel.set_bone_pose(idx_upperarm_l,Transform.IDENTITY.rotated(Vector3.FORWARD,PI/4)) - skel.set_bone_pose(idx_lowerarm_l,Transform.IDENTITY.rotated(Vector3.FORWARD,PI/4)) + var idx_upperarm_r = skel.find_bone("upperarm.r") + var idx_lowerarm_r = skel.find_bone("lowerarm.r") + + var T_UpperArmDown = Transform.IDENTITY.rotated(Vector3.RIGHT,-PI/3) + var Tl_Elbow90 = Transform.IDENTITY.rotated(Vector3.BACK,-PI/2) + var Tr_Elbow90 = Transform.IDENTITY.rotated(Vector3.BACK,PI/2) + + var T_ZminusPI4 = Transform.IDENTITY.rotated(Vector3.FORWARD,PI/4) + var T_ZplusPI4 = Transform.IDENTITY.rotated(Vector3.BACK,PI/4) + var T_YminusPI2 = Transform.IDENTITY.rotated(Vector3.UP,-PI/2) + skel.set_bone_pose(idx_upperarm_l,T_UpperArmDown) + skel.set_bone_pose(idx_upperarm_r,T_UpperArmDown) + + skel.set_bone_pose(idx_lowerarm_l,Tl_Elbow90) + skel.set_bone_pose(idx_lowerarm_r,Tr_Elbow90) # Called every frame. 'delta' is the elapsed time since the previous frame. diff --git a/GodotXRIKRig/docs/ik_arm.drawio.png b/GodotXRIKRig/docs/ik_arm.drawio.png new file mode 100644 index 0000000..e69de29 diff --git a/GodotXRIKRig/docs/ik_arm.drawio.png.import b/GodotXRIKRig/docs/ik_arm.drawio.png.import new file mode 100644 index 0000000..554f73a --- /dev/null +++ b/GodotXRIKRig/docs/ik_arm.drawio.png.import @@ -0,0 +1,30 @@ +[remap] + +importer="texture" +type="StreamTexture" +valid=false + +[deps] + +source_file="res://docs/ik_arm.drawio.png" +[params] + +compress/mode=0 +compress/lossy_quality=0.7 +compress/hdr_mode=0 +compress/bptc_ldr=0 +compress/normal_map=0 +flags/repeat=0 +flags/filter=true +flags/mipmaps=false +flags/anisotropic=false +flags/srgb=2 +process/fix_alpha_border=true +process/premult_alpha=false +process/HDR_as_SRGB=false +process/invert_color=false +process/normal_map_invert_y=false +stream=false +size_limit=0 +detect_3d=true +svg/scale=1.0 diff --git a/GodotXRIKRig/docs/whitepaper.md b/GodotXRIKRig/docs/whitepaper.md new file mode 100644 index 0000000..d82eef6 --- /dev/null +++ b/GodotXRIKRig/docs/whitepaper.md @@ -0,0 +1,37 @@ +# How the inverse kinematics is calculated + + + +The concept uses the following assumptions: + * The degrees-of-freedom are limited to + * Shoulder joint with 3dof and restrictive joint limits + * The elbow with only 1dof + * The wrist with 3dof and restrictive joint limits + * for humans, within the reachable elbow positions, some areas are more likely to be used due to less muscle strain + +## Proposal 1 for am pose estimate + +Input: + * controller position + * shoulder position estimate + +Output: + * Elbow position + * Shoulder backslash (required to improve shoulder position estimate) + +### Step 1: Initial elbow position estimate + +We try to get a first good estimate using a very simple method: given + * a vector *SpineShoulder*, going from the spine at approx. breast-hight to the shoulder position, and + * a vector *ShoulderWrist*, going from the shoulder to the wrist position, which can be easily inferred from the controller position, + * calculate the cross-product like this for the **right shoulder**: + ```var elbow_dir = SpineShoulder.cross(ShoulderWrist)```. + +### Step 2: Consider controller orientation + + +### Step 3: Consider shoulder orientation + + +### Step 4: Determine shoulder backslash for shoulder position estimation +