Android

功能说明

输入相机的 openGL 纹理,实时输出身体3D数据。您可以利用这些3D数据做一进步的开发,例如传到 Unity 中驱动您的模型。

Android 集成指引

首先需要集成腾讯特效SDK,具体请参见 独立集成腾讯特效

接口调用

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