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)。
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 |