MMD 작업 추적을 통한 자동화된 센터 추정
5212 단어 3d-pose-baselineMMDPython
개시하다
이 문장은 [목록] MMD 동작 추적 자동화에 대한 도전의 한 부분이다.
도입 방법과 기타 기술 해설 등은 상기 목록에서 각 보도를 참조하십시오.
기본적으로 자기가 쓰는 숙제 노트다.
Github
3d-pose-baseline-vmd
VMD-3d-pose-baseline-multi
과제.
3d-pose-baseline-vmd에서 얻은 3D 데이터에 센터 이동 데이터가 포함되지 않음
메서드
3d-pose-baseline-vmd에서 얻은 3D 데이터에 센터 이동 데이터가 포함되지 않음
메서드
해결책
내 힘이야.똑똑하지 않아..
영상은 바보씨의 SNOBBISM를 빌린 것이다.당신의 사용 허가에 감사 드립니다!
사전 준비
Openpose의 관절 위치 정보 얻기
VMD 생성 프로세스에서 Openpose를 통해 해결된 2D의 관절 위치 정보를 사용합니다.
그러나 오픈포스 자체 데이터가 마구잡이로 뛰는 경우가 있어 3d-pose-baseline-vmd
가 3D로 바뀌기 전에 정규화된 2D 데이터smoothed.txt
를 준비한다.
직립 프레임 선택
정면직립의 틀을 가급적 결정하다.
구체적으로 오픈포스에서 목과 두 발끝 부분이 이등변 삼각형으로 된 프레임이다.
프레임을 MMD의 중심(0, 0, 0)으로 보고 다음과 같이 처리합니다.
X축 이동
처리 대상 프레임의 머리, 왼발 뿌리, 오른발 뿌리의 X축의 평균치를 구한다.
머리뿐만 아니라 Y축 방향으로 기울어지는 상황을 고려하기 위해서다.
대충 말하면 배꼽의 위치를 찾는 것 같다.
# 首・左足・右足の中心部分をX軸移動
x_avg = ((smoothed_2d[n][0].x() + smoothed_2d[n][1].x() + smoothed_2d[n][2].x()) / 3) - smoothed_2d[upright_idx][0].x()
bone_frame_dic["センター"][n].position.setX(x_avg * upright_xy_scale)
카메라와의 거리 이동량이 달라지기 때문에 이 일대는 현재 외부 매개 변수를 통해 흡수되고 있다.
Y축 이동
처리 대상 프레임의 왼쪽 발, 오른쪽 발에 Y축의 평균을 구합니다.
한쪽 발이 아닌 것은 Z축 방향으로 기울어지는 상황을 고려하기 위해서다.# 左足と右足の位置の平均
leg_avg = abs((smoothed_2d[n][1].y() + smoothed_2d[n][2].y()) / 2)
# 足の上下差
leg_diff = upright_leg_avg - leg_avg
# Y軸移動
if is_groove:
# グルーブがある場合には、そっちに割り当てる
bone_frame_dic["グルーブ"][n].position.setY(leg_diff * upright_xy_scale)
else:
bone_frame_dic["センター"][n].position.setY(leg_diff * upright_xy_scale)
이것도 외부 파라미터를 통해 이동량을 조절할 수 있다.
표준 모델을 추적 객체로 읽어들일 때 Y축 이동량을 그룹에 지정합니다.
#트레이로취향
Z축 이동
※ 가처분.향후 조정 가능성이 크다.
두루뭉술하게 말하면 목과 두 발 뿌리 부분의 이차원 면적은 2D와 3D 두 방면으로 계산된 것으로 축소 비율에 따라 계산된다.
2D 직립 프레임의 2D 면적
그림은 직립 프레임 선택을 참조하십시오.# 直立フレームの三角形面積
smoothed_upright_area = calc_triangle_area(smoothed_2d[upright_idx][0], smoothed_2d[upright_idx][1], smoothed_2d[upright_idx][2])
3D 직립 프레임의 투영 2D 영역
# 3Dでの首・左足・右足の投影三角形
pos_upright_area = calc_triangle_area(positions_multi[upright_idx][8], positions_multi[upright_idx][1], positions_multi[upright_idx][4])
2D 처리 프레임의 2D 영역
# 2Dでの首・左足・右足の投影三角形
smoothed_now_area = calc_triangle_area(smoothed_2d[n][0], smoothed_2d[n][1], smoothed_2d[n][2])
3D 처리 프레임의 투영 2D 영역
# 3Dでの首・左足・右足の投影三角形
pos_now_area = calc_triangle_area(positions_multi[n][8], positions_multi[n][1], positions_multi[n][4])
2D 면적의 축척
카메라로 보면 멀어질수록 축척이 작아진다# 2Dでの現在の縮尺
smoothed_scale = smoothed_now_area / smoothed_upright_area
3D 영역의 축척
기울기가 클수록 축척은 작아진다# 3Dでの現在の縮尺
pos_scale = pos_now_area / pos_upright_area
Z축 계산하기
3D面積の縮尺 * (1 - 2D面積の縮尺)
에서 기울기를 고려한 Z축 거리 계산
1. 1 - 2D面積の縮尺
는 MMD 중심 데이텀의 Z축 위치입니다.
→ 마이너스 접근, 플러스 멀리하기
2.3D面積の縮尺
에서 중령의 경사도
→기울기가 클수록(3D 축척이 작을수록) Z축의 이동량이 작아집니다.
어쨌든 정면이나 기울기가 크면 2D 면적이 작아도 안에 넣지 않는다.# Z軸移動位置の算出
now_z_scale = pos_scale * (1 - smoothed_scale)
# Z軸の移動補正
bone_frame_dic["センター"][n].position.setZ(now_z_scale * center_z_scale)
Z축 보정은 XY 이동량과 연동되지 않는 모드가 있으므로 외부 매개변수를 통해 이동량을 별도로 조정할 수 있습니다.
과제.
# 首・左足・右足の中心部分をX軸移動
x_avg = ((smoothed_2d[n][0].x() + smoothed_2d[n][1].x() + smoothed_2d[n][2].x()) / 3) - smoothed_2d[upright_idx][0].x()
bone_frame_dic["センター"][n].position.setX(x_avg * upright_xy_scale)
# 左足と右足の位置の平均
leg_avg = abs((smoothed_2d[n][1].y() + smoothed_2d[n][2].y()) / 2)
# 足の上下差
leg_diff = upright_leg_avg - leg_avg
# Y軸移動
if is_groove:
# グルーブがある場合には、そっちに割り当てる
bone_frame_dic["グルーブ"][n].position.setY(leg_diff * upright_xy_scale)
else:
bone_frame_dic["センター"][n].position.setY(leg_diff * upright_xy_scale)
# 直立フレームの三角形面積
smoothed_upright_area = calc_triangle_area(smoothed_2d[upright_idx][0], smoothed_2d[upright_idx][1], smoothed_2d[upright_idx][2])
# 3Dでの首・左足・右足の投影三角形
pos_upright_area = calc_triangle_area(positions_multi[upright_idx][8], positions_multi[upright_idx][1], positions_multi[upright_idx][4])
# 2Dでの首・左足・右足の投影三角形
smoothed_now_area = calc_triangle_area(smoothed_2d[n][0], smoothed_2d[n][1], smoothed_2d[n][2])
# 3Dでの首・左足・右足の投影三角形
pos_now_area = calc_triangle_area(positions_multi[n][8], positions_multi[n][1], positions_multi[n][4])
# 2Dでの現在の縮尺
smoothed_scale = smoothed_now_area / smoothed_upright_area
# 3Dでの現在の縮尺
pos_scale = pos_now_area / pos_upright_area
# Z軸移動位置の算出
now_z_scale = pos_scale * (1 - smoothed_scale)
# Z軸の移動補正
bone_frame_dic["センター"][n].position.setZ(now_z_scale * center_z_scale)
다음 계획
가장 큰 난관은 무려 IK화이다.언제가 될지...
Reference
이 문제에 관하여(MMD 작업 추적을 통한 자동화된 센터 추정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/miu200521358/items/2a43d8c7da92eb940a05
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(MMD 작업 추적을 통한 자동화된 센터 추정), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/miu200521358/items/2a43d8c7da92eb940a05텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)