Android

기능 설명

카메라에서 캡처한 openGL 텍스처를 기반으로 신체 3D 데이터를 생성할 수 있습니다. 3D 데이터를 기반으로 추가 개발을 수행할 수 있습니다. 예를 들어 Unity에 데이터를 전달하여 모델을 구동할 수 있습니다.

Android 통합

먼저 Tencent Effect SDK를 통합해야 합니다. 자세한 내용은 Tencent Effect SDK 통합하기를 참고하십시오.

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