Android
기능 설명
카메라에서 캡처한 openGL 텍스처를 기반으로 신체 3D 데이터를 생성할 수 있습니다. 3D 데이터를 기반으로 추가 개발을 수행할 수 있습니다. 예를 들어 Unity에 데이터를 전달하여 모델을 구동할 수 있습니다.
Android 통합
API 호출
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 데이터를 반환합니다. 예TL는 다음과 같습니다.
"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의 서로 다른 mesh 10세트를 베이스로 조합하여 체형 추정
(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
골격에 따른 명명 방식 및 해당 관계
No. | 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 |