정점 위치 취득의 처리 속도를 높이는 방법

5372 단어 파이썬maya
이 기사는 Maya Advent Calendar 2019의 7 일째 기사입니다.

Maya에서 모델링을위한 도구를 만들면 선택한 객체의 정점 위치를 얻을 수 있습니다.
단지 정점수가 많은 모델로 MEL이나 cmds로 전체 정점 위치를 취득하면 늦게, 모델링 작업에 지장이 나오는 레벨입니다.
처리 속도를 높이는 방법으로서 자주 OpenMaya가 소개되고 있습니다만, 자신에게 있어서는 문턱이 높고, cmds로 더 처리 속도를 올리는 방법이 없을까 생각하고 있었습니다.

이전 쓰기



나는 이전에는 이런 글을 쓰고 있었다.
from maya import cmds

sel_obj = cmds.ls(sl=True)
verts = cmds.ls(sel_obj[0] + '.vtx[*]', fl=True)
vert_pos = [cmds.xform(vert, t=True, ws=True, q=True) for vert in verts]

그러나 이 쓰는 방법으로 취득하면 정점수가 많은 객체라면 상당히 시간이 걸립니다.

처리 속도를 측정해 보기



우선 장면에 Subdivisions Axis, Subdivisions Height 모두 200의 매우 아름다운 구체를 만듭니다.



정점수는 39802입니다.

이 구체를 선택하고 위의 스크립트를 Python의 time 모듈을 사용하여 측정해 보겠습니다.



약 2초 걸렸습니다. 이 속도라면 모델링 작업에 지장이 나오는 레벨입니다.

새로운 쓰기


from maya import cmds

sel_obj = cmds.ls(sl=True)
verts = cmds.ls(sel_obj[0] + '.vtx[*]')
vert_pos = cmds.xform(verts, t=True, ws=True, q=True)

ls 명령의 fl 플래그를 제거하고 얻은 정점 목록을 함께 xform 인수에 제공합니다.
이제 다시 처리 속도를 측정해 보겠습니다.



약 0.06초! 대략 33배 고속화했습니다.

XYZ별 목록으로 바꾸기



단지 반환되는 값을 보면 1차원 배열로 되어 있으므로 for로 처리했을 때와 같은 값을 반환하려면 아래 코드를 추가하여 XYZ별 2차원 배열로 바꿔야 합니다.
vert_pos = [vert_pos[i:i + 3] for i in range(0, len(vert_pos), 3)]

요약



이상, 정점 위치 취득의 처리 속도를 높이는 방법을 올리는 방법이었습니다.

굉장히 소립인 기사입니다만, 자신에게 있어서는 발견이었으므로 메모가 굳이 써 주셨습니다.
Maya는 이러한 리스트를 인수에 취할 수 있는 함수가 있어, for로 처리하는 것보다 상당히 빠르거나, 리스트를 줄 때도 중복을 생략하는 것으로 빨라지는 일이 있습니다.

자신이 보는 한, 공식 문서로 그 인수가 리스트 가능한가 어떤가를 확인할 수 없기 때문에, 테스트해 볼 수밖에 없는 것이 귀찮습니다…

만약 기사내에서 실수나 불명점등 있으면 기입해 주실 수 있으면 다행입니다.
끝까지 읽어 주셔서 감사합니다.

좋은 웹페이지 즐겨찾기