Android

機能説明

カメラのopenGLテクスチャを入力すると、体の3Dデータがリアルタイムで出力されます。これらの3Dデータを利用して、Unityに渡してモデルを動かすといった、さらに進んだ開発を行うことができます。

Android統合ガイド

初めにTencent Effect SDKへの統合をする必要があります。具体的な内容は、Tencent Effectの独立した統合をご参照ください。

インターフェースの呼び出し

1. 機能スイッチをオンにします(XmagicApi.java)。
public void setFeatureEnableDisable(String featureName, boolean enable);
featureNameにXmagicConstant.FeatureName.BODY_3D_POINTを入力します。
2. データコールバックの設定(XmagicApi.java)。
void setYTDataListener(XmagicApi.XmagicYTDataListener ytDataListener)

public interface XmagicYTDataListener {
void onYTDataUpdate(String data)
}
onYTDataUpdateはJSON構造のstringデータを返します。例:
「face_info」は、顔に関するデータです。体の3Dデータとは関係ありませんので、無視することができます。
「body_3d_info」の各フィールドの説明については、下記のとおりです

体の特徴点位置および特徴点位置データの説明

標準SMPL特徴点位置の定義

標準SMPLX手の骨格の特徴点位置の定義


SDKが出力するJSONデータの例は、次のとおりです。

body_3d_infoの各フィールドの説明については、下記のとおりです。
imageWidth、imageHeight:SDKの画像の幅と高さを入力します
items:配列。現時点では1つの要素のみです
index:位置の保持。現時点では無視することができます
pose:
(1) [0,2]位置。人の位置はカメラ中心で、人の骨格の3D位置はxyzです
(2)[3,12]位置。人のタイプは10float数です。標準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]位置。人の骨格の回転は4元数であり、各4元数の属性の順序はwxyzです
(2)[25,54]位置、手の骨格の回転は4元数です。左手が15で、右手も15で、各4元数の属性の順序は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