MMD 작업 추적을 통한 자동화된 센터 추정

개시하다


이 문장은 [목록] MMD 동작 추적 자동화에 대한 도전의 한 부분이다.
도입 방법과 기타 기술 해설 등은 상기 목록에서 각 보도를 참조하십시오.
기본적으로 자기가 쓰는 숙제 노트다.

Github


3d-pose-baseline-vmd
VMD-3d-pose-baseline-multi

과제.


3d-pose-baseline-vmd에서 얻은 3D 데이터에 센터 이동 데이터가 포함되지 않음

메서드

  • Openpose에서 관절 위치의 이동이 이루어졌기 때문에 Openpose의 데이터를 사용하면 중심 이동이 가능할 것으로 추정됨
  • 기준점이 있다고 가정하면 이동량도 측정할 수 있다
  • 해결책


    내 힘이야.똑똑하지 않아..
    영상은 바보씨의 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 이동량과 연동되지 않는 모드가 있으므로 외부 매개변수를 통해 이동량을 별도로 조정할 수 있습니다.

    과제.

  • 허리에서 상반신을 앞으로 꺾는 자세일 때 Z축이 움직일 때 희망 전에 움직이기 쉽다.
  • XY와 Z축의 이동량은 외부 매개변수에 따라 달라집니다.자동 판정이 됐으면 좋겠는데...
  • 다음 계획


    가장 큰 난관은 무려 IK화이다.언제가 될지...

    좋은 웹페이지 즐겨찾기