mirror of
https://gitlab.freedesktop.org/monado/monado.git
synced 2025-01-01 12:46:12 +00:00
u/hand_tracking: Curl fingers based on joint, increase total curl angle
When making a fist, different joints curl at different angles, reflect this more directly in the code. Also increase total curl to make it easier to hold ingame objects.
This commit is contained in:
parent
679a1233ee
commit
3085e29c97
|
@ -94,21 +94,21 @@ static struct u_joint_curl_model
|
||||||
[XRT_HAND_JOINT_LITTLE_PROXIMAL] =
|
[XRT_HAND_JOINT_LITTLE_PROXIMAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, DEG_TO_RAD(20), 0},
|
.axis_angle_offset = {0, DEG_TO_RAD(20), 0},
|
||||||
.bone_length = 0.037,
|
.bone_length = 0.035,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_LITTLE_PROXIMAL},
|
.joint_id = XRT_HAND_JOINT_LITTLE_PROXIMAL},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_LITTLE_INTERMEDIATE] =
|
[XRT_HAND_JOINT_LITTLE_INTERMEDIATE] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.02,
|
.bone_length = 0.028,
|
||||||
.radius = 0.009,
|
.radius = 0.009,
|
||||||
.joint_id = XRT_HAND_JOINT_LITTLE_INTERMEDIATE},
|
.joint_id = XRT_HAND_JOINT_LITTLE_INTERMEDIATE},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_LITTLE_DISTAL] =
|
[XRT_HAND_JOINT_LITTLE_DISTAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.02,
|
.bone_length = 0.022,
|
||||||
.radius = 0.009,
|
.radius = 0.009,
|
||||||
.joint_id = XRT_HAND_JOINT_LITTLE_DISTAL},
|
.joint_id = XRT_HAND_JOINT_LITTLE_DISTAL},
|
||||||
|
|
||||||
|
@ -131,21 +131,21 @@ static struct u_joint_curl_model
|
||||||
[XRT_HAND_JOINT_RING_PROXIMAL] =
|
[XRT_HAND_JOINT_RING_PROXIMAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, DEG_TO_RAD(10), 0},
|
.axis_angle_offset = {0, DEG_TO_RAD(10), 0},
|
||||||
.bone_length = 0.047,
|
.bone_length = 0.040,
|
||||||
.radius = 0.012,
|
.radius = 0.012,
|
||||||
.joint_id = XRT_HAND_JOINT_RING_PROXIMAL},
|
.joint_id = XRT_HAND_JOINT_RING_PROXIMAL},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_RING_INTERMEDIATE] =
|
[XRT_HAND_JOINT_RING_INTERMEDIATE] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.027,
|
.bone_length = 0.031,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_RING_INTERMEDIATE},
|
.joint_id = XRT_HAND_JOINT_RING_INTERMEDIATE},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_RING_DISTAL] =
|
[XRT_HAND_JOINT_RING_DISTAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.017,
|
.bone_length = 0.023,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_RING_DISTAL},
|
.joint_id = XRT_HAND_JOINT_RING_DISTAL},
|
||||||
|
|
||||||
|
@ -153,35 +153,35 @@ static struct u_joint_curl_model
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0,
|
.bone_length = 0,
|
||||||
.radius = 0.012,
|
.radius = 0.013,
|
||||||
.joint_id = XRT_HAND_JOINT_RING_TIP},
|
.joint_id = XRT_HAND_JOINT_RING_TIP},
|
||||||
|
|
||||||
|
|
||||||
[XRT_HAND_JOINT_MIDDLE_METACARPAL] =
|
[XRT_HAND_JOINT_MIDDLE_METACARPAL] =
|
||||||
{.position_offset = {.x = 0.00, .y = 0, .z = -0.039},
|
{.position_offset = {.x = 0.00, .y = 0, .z = -0.039},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.055,
|
.bone_length = 0.045,
|
||||||
.radius = 0.012,
|
.radius = 0.012,
|
||||||
.joint_id = XRT_HAND_JOINT_MIDDLE_METACARPAL},
|
.joint_id = XRT_HAND_JOINT_MIDDLE_METACARPAL},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_MIDDLE_PROXIMAL] =
|
[XRT_HAND_JOINT_MIDDLE_PROXIMAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.05,
|
.bone_length = 0.042,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_MIDDLE_PROXIMAL},
|
.joint_id = XRT_HAND_JOINT_MIDDLE_PROXIMAL},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_MIDDLE_INTERMEDIATE] =
|
[XRT_HAND_JOINT_MIDDLE_INTERMEDIATE] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.03,
|
.bone_length = 0.033,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_MIDDLE_INTERMEDIATE},
|
.joint_id = XRT_HAND_JOINT_MIDDLE_INTERMEDIATE},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_MIDDLE_DISTAL] =
|
[XRT_HAND_JOINT_MIDDLE_DISTAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.02,
|
.bone_length = 0.024,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_MIDDLE_DISTAL},
|
.joint_id = XRT_HAND_JOINT_MIDDLE_DISTAL},
|
||||||
|
|
||||||
|
@ -203,21 +203,21 @@ static struct u_joint_curl_model
|
||||||
[XRT_HAND_JOINT_INDEX_PROXIMAL] =
|
[XRT_HAND_JOINT_INDEX_PROXIMAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, DEG_TO_RAD(-10), 0},
|
.axis_angle_offset = {0, DEG_TO_RAD(-10), 0},
|
||||||
.bone_length = 0.048,
|
.bone_length = 0.040,
|
||||||
.radius = 0.011,
|
.radius = 0.011,
|
||||||
.joint_id = XRT_HAND_JOINT_INDEX_PROXIMAL},
|
.joint_id = XRT_HAND_JOINT_INDEX_PROXIMAL},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_INDEX_INTERMEDIATE] =
|
[XRT_HAND_JOINT_INDEX_INTERMEDIATE] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.021,
|
.bone_length = 0.031,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_INDEX_INTERMEDIATE},
|
.joint_id = XRT_HAND_JOINT_INDEX_INTERMEDIATE},
|
||||||
|
|
||||||
[XRT_HAND_JOINT_INDEX_DISTAL] =
|
[XRT_HAND_JOINT_INDEX_DISTAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.021,
|
.bone_length = 0.023,
|
||||||
.radius = 0.01,
|
.radius = 0.01,
|
||||||
.joint_id = XRT_HAND_JOINT_INDEX_DISTAL},
|
.joint_id = XRT_HAND_JOINT_INDEX_DISTAL},
|
||||||
|
|
||||||
|
@ -247,7 +247,7 @@ static struct u_joint_curl_model
|
||||||
[XRT_HAND_JOINT_THUMB_DISTAL] =
|
[XRT_HAND_JOINT_THUMB_DISTAL] =
|
||||||
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
{.position_offset = {.x = 0, .y = 0, .z = 0},
|
||||||
.axis_angle_offset = {0, 0, 0},
|
.axis_angle_offset = {0, 0, 0},
|
||||||
.bone_length = 0.026,
|
.bone_length = 0.028,
|
||||||
.radius = 0.017,
|
.radius = 0.017,
|
||||||
.joint_id = XRT_HAND_JOINT_THUMB_DISTAL},
|
.joint_id = XRT_HAND_JOINT_THUMB_DISTAL},
|
||||||
|
|
||||||
|
@ -266,6 +266,45 @@ quat_from_angle_vector_clockwise(float angle_rads,
|
||||||
math_quat_from_angle_vector(-angle_rads, vector, result);
|
math_quat_from_angle_vector(-angle_rads, vector, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_metacarpal(enum xrt_hand_joint joint)
|
||||||
|
{
|
||||||
|
return joint == XRT_HAND_JOINT_LITTLE_METACARPAL ||
|
||||||
|
joint == XRT_HAND_JOINT_RING_METACARPAL ||
|
||||||
|
joint == XRT_HAND_JOINT_MIDDLE_METACARPAL ||
|
||||||
|
joint == XRT_HAND_JOINT_INDEX_METACARPAL ||
|
||||||
|
joint == XRT_HAND_JOINT_THUMB_METACARPAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_proximal(enum xrt_hand_joint joint)
|
||||||
|
{
|
||||||
|
return joint == XRT_HAND_JOINT_LITTLE_PROXIMAL ||
|
||||||
|
joint == XRT_HAND_JOINT_RING_PROXIMAL ||
|
||||||
|
joint == XRT_HAND_JOINT_MIDDLE_PROXIMAL ||
|
||||||
|
joint == XRT_HAND_JOINT_INDEX_PROXIMAL ||
|
||||||
|
joint == XRT_HAND_JOINT_THUMB_PROXIMAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_intermediate(enum xrt_hand_joint joint)
|
||||||
|
{
|
||||||
|
return joint == XRT_HAND_JOINT_LITTLE_INTERMEDIATE ||
|
||||||
|
joint == XRT_HAND_JOINT_RING_INTERMEDIATE ||
|
||||||
|
joint == XRT_HAND_JOINT_MIDDLE_INTERMEDIATE ||
|
||||||
|
joint == XRT_HAND_JOINT_INDEX_INTERMEDIATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_distal(enum xrt_hand_joint joint)
|
||||||
|
{
|
||||||
|
return joint == XRT_HAND_JOINT_LITTLE_DISTAL ||
|
||||||
|
joint == XRT_HAND_JOINT_RING_DISTAL ||
|
||||||
|
joint == XRT_HAND_JOINT_MIDDLE_DISTAL ||
|
||||||
|
joint == XRT_HAND_JOINT_INDEX_DISTAL ||
|
||||||
|
joint == XRT_HAND_JOINT_THUMB_DISTAL;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
u_hand_joint_is_tip(enum xrt_hand_joint joint)
|
u_hand_joint_is_tip(enum xrt_hand_joint joint)
|
||||||
{
|
{
|
||||||
|
@ -277,13 +316,12 @@ u_hand_joint_is_tip(enum xrt_hand_joint joint)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
u_hand_joint_is_metacarpal(enum xrt_hand_joint joint)
|
u_hand_joint_is_thumb(enum xrt_hand_joint joint)
|
||||||
{
|
{
|
||||||
return joint == XRT_HAND_JOINT_LITTLE_METACARPAL ||
|
return joint == XRT_HAND_JOINT_THUMB_METACARPAL ||
|
||||||
joint == XRT_HAND_JOINT_RING_METACARPAL ||
|
joint == XRT_HAND_JOINT_THUMB_PROXIMAL ||
|
||||||
joint == XRT_HAND_JOINT_MIDDLE_METACARPAL ||
|
joint == XRT_HAND_JOINT_THUMB_DISTAL ||
|
||||||
joint == XRT_HAND_JOINT_INDEX_METACARPAL ||
|
joint == XRT_HAND_JOINT_THUMB_TIP;
|
||||||
joint == XRT_HAND_JOINT_THUMB_METACARPAL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -356,16 +394,32 @@ u_hand_joint_compute_next_by_curl(struct u_hand_tracking *set,
|
||||||
|
|
||||||
// proximal, intermediate, and distal joints (+ bones) will rotate
|
// proximal, intermediate, and distal joints (+ bones) will rotate
|
||||||
//! @todo make this tunable
|
//! @todo make this tunable
|
||||||
const float full_curl_angle = -M_PI / 3.;
|
// full curl angle for this joint at 1.0 value
|
||||||
float curl_angle = curl_value * full_curl_angle;
|
float full_curl_angle = 0;
|
||||||
|
if (u_hand_joint_is_thumb(out_joint->joint_id)) {
|
||||||
if (u_hand_joint_is_metacarpal(out_joint->joint_id) ||
|
if (u_hand_joint_is_metacarpal(out_joint->joint_id)) {
|
||||||
u_hand_joint_is_tip(out_joint->joint_id)) {
|
full_curl_angle = DEG_TO_RAD(10);
|
||||||
curl_angle = 0;
|
} else if (u_hand_joint_is_proximal(out_joint->joint_id)) {
|
||||||
|
full_curl_angle = DEG_TO_RAD(30);
|
||||||
|
} else if (u_hand_joint_is_distal(out_joint->joint_id)) {
|
||||||
|
full_curl_angle = DEG_TO_RAD(80);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (u_hand_joint_is_metacarpal(out_joint->joint_id)) {
|
||||||
|
full_curl_angle = DEG_TO_RAD(0);
|
||||||
|
} else if (u_hand_joint_is_proximal(out_joint->joint_id)) {
|
||||||
|
full_curl_angle = DEG_TO_RAD(70);
|
||||||
|
} else if (u_hand_joint_is_intermediate(out_joint->joint_id)) {
|
||||||
|
full_curl_angle = DEG_TO_RAD(90);
|
||||||
|
} else if (u_hand_joint_is_distal(out_joint->joint_id)) {
|
||||||
|
full_curl_angle = DEG_TO_RAD(65);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float curl_angle = curl_value * full_curl_angle;
|
||||||
|
|
||||||
struct xrt_quat curl_rotation;
|
struct xrt_quat curl_rotation;
|
||||||
math_quat_from_angle_vector(curl_angle, &x_axis, &curl_rotation);
|
math_quat_from_angle_vector(-curl_angle, &x_axis, &curl_rotation);
|
||||||
math_quat_rotate(&pose.orientation, &curl_rotation, &pose.orientation);
|
math_quat_rotate(&pose.orientation, &curl_rotation, &pose.orientation);
|
||||||
|
|
||||||
//! @todo: full relation with velocities
|
//! @todo: full relation with velocities
|
||||||
|
|
|
@ -113,6 +113,36 @@ u_hand_joint_is_tip(enum xrt_hand_joint joint);
|
||||||
bool
|
bool
|
||||||
u_hand_joint_is_metacarpal(enum xrt_hand_joint joint);
|
u_hand_joint_is_metacarpal(enum xrt_hand_joint joint);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @ingroup aux_util
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_proximal(enum xrt_hand_joint joint);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @ingroup aux_util
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_intermediate(enum xrt_hand_joint joint);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @ingroup aux_util
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_distal(enum xrt_hand_joint joint);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @ingroup aux_util
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_tip(enum xrt_hand_joint joint);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* @ingroup aux_util
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
u_hand_joint_is_thumb(enum xrt_hand_joint joint);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* Initializes a hand tracking set with default data.
|
* Initializes a hand tracking set with default data.
|
||||||
*
|
*
|
||||||
|
|
Loading…
Reference in a new issue