It have some code in vex to do this, however it doesn't quite seem to do the conversions correctly when I am am trying to adjust agentrig_footoffsets in World Space.
I also attached a file.
int verbose = chi("verbose_debug"); // Get foot offsets (Local Space) vector footoffsets[] = point(0, "agentrig_footoffsets", @ptnum); // Joint names (e.g., LeftFoot, LeftToe_End, etc.) string joints[] = s[]@agentrig_lowerlimbs; string joint_names[] = array(joints[2], joints[3], joints[6], joints[7]); // Additional Offsets (World Space) vector additional_offsets[] = array( chv("add_left_ankle"), chv("add_left_toe"), chv("add_right_ankle"), chv("add_right_toe") ); // Joint indices int joint_indices[] = array(); foreach (string name; joint_names) append(joint_indices, agentrigfind(0, @primnum, name)); // Get local transforms for all joints matrix local_xforms[] = agentlocaltransforms(0, @primnum); // Convert to world transforms matrix world_xforms[] = local_xforms; agenttransformtoworld(0, @primnum, world_xforms); // For each joint of interest for (int i = 0; i < len(joint_indices); i++) { int joint_idx = joint_indices[i]; if (joint_idx < 0 || joint_idx >= len(world_xforms)) continue; string joint_name = joint_names[i]; matrix local_xform = local_xforms[joint_idx]; matrix world_xform = world_xforms[joint_idx]; // Transform foot offset to world space vector foot_offset_local = footoffsets[i]; vector foot_offset_world = foot_offset_local * world_xform; // Add the world-space offset vector foot_offset_world_new = foot_offset_world + additional_offsets[i]; // Convert the updated offset back to joint-local space vector foot_offset_local_new = foot_offset_world_new * invert(world_xform); // Store result footoffsets[i] = foot_offset_local_new; if (verbose) { printf("\n=== [%s] Joint idx %d ===\n", joint_name, joint_idx); printf("Original Foot Offset (Local Space): %g\n", foot_offset_local); printf("Original Foot Offset (World Space): %g\n", foot_offset_world); printf("Additional Offset (World Space): %g\n", additional_offsets[i]); printf("New Foot Offset (World Space): %g\n", foot_offset_world_new); printf("New Foot Offset (Local Space): %g\n", foot_offset_local_new); printf("[%s] World Transform:\n", joint_name); for (int r = 0; r < 4; r++) { vector row = set( getcomp(world_xform, r, 0), getcomp(world_xform, r, 1), getcomp(world_xform, r, 2) ); printf("Row %d: %g %g %g\n", r, row.x, row.y, row.z); } printf("[%s] Local Transform:\n", joint_name); for (int r = 0; r < 4; r++) { vector row = set( getcomp(local_xform, r, 0), getcomp(local_xform, r, 1), getcomp(local_xform, r, 2) ); printf("Row %d: %g %g %g\n", r, row.x, row.y, row.z); } } } // Save updated offsets back setpointattrib(0, "agentrig_footoffsets", @ptnum, footoffsets, "set");

