Android
功能说明
输入相机的 openGL 纹理,实时输出身体3D数据。您可以利用这些3D数据做一进步的开发,例如传到 Unity 中驱动您的模型。
Android 集成指引
接口调用
1. 打开功能开关(XmagicApi.java)。
public void setFeatureEnableDisable(String featureName, boolean enable);
featureName 填
XmagicConstant.FeatureName.BODY_3D_POINT
。2. 设置数据回调(XmagicApi.java)。
2.6.0及之前版本使用如下方法
void setYTDataListener(XmagicApi.XmagicYTDataListener ytDataListener)public interface XmagicYTDataListener {void onYTDataUpdate(String data)}
onYTDataUpdate 返回 JSON 结构的 string 数据,其示例如下:
"face_info" 里是人脸相关的数据,与身体 3D 数据无关,可以忽略。
"body_3d_info" 里各字段说明见下文。
3.0.0版本使用如下方法
void setAIDataListener(XmagicApi.OnAIDataListener aiDataListener)public interface OnAIDataListener {void onFaceDataUpdated(List<TEFaceData> faceDataList);void onHandDataUpdated(List<TEHandData> handDataList);void onBodyDataUpdated(List<TEBodyData> bodyDataList);void onAIDataUpdated(String data); //此方法是3.0.0版本新增方法,数据结构和之前XmagicYTDataListener接口的数据保持一致}
onAIDataUpdated 返回 JSON 结构的 string 数据,其示例如下:
"face_info" 里是人脸相关的数据,与身体 3D 数据无关,可以忽略。
"body_3d_info" 里各字段说明见下文。
身体点位及点位数据说明
标准 SMPL 点位定义
标准 SMPLX 手部骨骼点位定义
SDK 输出的 JSON 数据示例如下:
body_3d_info 里各个字段说明如下:
imageWidth,imageHeight:输入给SDK的图像的宽高
items:数组,目前只有一个元素
index:保留位,目前可以忽略它
pose:
(1) [0,2]位置,人体位置,以相机为中心,人体根骨骼的3D位置xyz
(2)[3,12]位置,人体形态,10个float数,以标准SMPL的10套不同mesh为基底,组合得到人体型的估计
(3)[13]位置,Focal_length,固定值为5000
(4)[14,29]位置,OpenGL投影矩阵,基于focal_length得到的在3D空间中渲染物体的投影矩阵。4X4投影矩阵在算法内部计算方式:
matrix={2 * focal_length / img_wid, 0, 0, 0,0, 2 * focal_length / img_hei, 0,0,0,0, (zf + zn) / (zn - zf), -1,0, 0, (2.0f * zf * zn) / (zn - zf), 0};}
(5)[30,33]位置,接地数据,脚是否踩地,左脚跟、左脚尖、右脚跟、右脚尖
position_x,position_y,position_z:
(1)[0,23]位置,人体2D点位,见上文的图1, 2D点的 position_z 都是0
(2)[24,47]位置,人体3D点位,见上文的图1
rotation
(1)[0,23]位置,人体骨骼旋转四元数,每个四元数的属性顺序是 wxyz
(2)[25,54]位置,手部骨骼旋转四元数,左手15个,右手15个,每个四元数的属性顺序是 wxyz
骨骼的不同命名方式及对应关系
序号 | Bone Names | Bone Names 2 |
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | "pelvis", "left_hip", "right_hip", "spine1", "left_knee", "right_knee", "spine2", "left_ankle", "right_ankle", "spine3", "left_foot", "right_foot", "neck", "left_collar", "right_collar", "head", "left_shoulder", "right_shoulder", "left_elbow", "right_elbow", "left_wrist", "right_wrist", "left_hand" "right_hand" | "Hips" "LeftUpLeg" "RightUpLeg" "Spine" "LeftLeg" "RightLeg" "Spine1" "LeftFoot" "RightFoot" "Spine2" "" "" "Neck" "LeftShoulder" "RightShoulder" "Head" "LeftArm" "RightArm" "LeftForeArm" "RightForeArm" "LeftHand" "RightHand" "" "" |
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | "left_index1" "left_index2" "left_index3" "left_middle1" "left_middle2" "left_middle3" "left_pinky1" "left_pinky2" "left_pinky3" "left_ring1" "left_ring2" "left_ring3" "left_thumb1" "left_thumb2" "left_thumb3 | IndexFinger1_L IndexFinger2_L IndexFinger3_L MiddleFinger1_L MiddleFinger2_L MiddleFinger3_L PinkyFinger1_L PinkyFinger2_L PinkyFinger3_L RingFinger1_L RingFinger2_L RingFinger3_L ThumbFinger1_L ThumbFinger2_L ThumbFinger3_L |
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | "right_index1" "right_index2" "right_index3" "right_middle1" "right_middle2" "right_middle3" "right_pinky1" "right_pinky2" "right_pinky3" "right_ring1" "right_ring2" "right_ring3" "right_thumb1" "right_thumb2" "right_thumb3" | IndexFinger1_R IndexFinger2_R IndexFinger3_R MiddleFinger1_R MiddleFinger2_R MiddleFinger3_R PinkyFinger1_R PinkyFinger2_R PinkyFinger3_R RingFinger1_R RingFinger2_R RingFinger3_R ThumbFinger1_R ThumbFinger2_R ThumbFinger3_R |