정점 위치 취득의 처리 속도를 높이는 방법
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로 처리하는 것보다 상당히 빠르거나, 리스트를 줄 때도 중복을 생략하는 것으로 빨라지는 일이 있습니다.
자신이 보는 한, 공식 문서로 그 인수가 리스트 가능한가 어떤가를 확인할 수 없기 때문에, 테스트해 볼 수밖에 없는 것이 귀찮습니다…
만약 기사내에서 실수나 불명점등 있으면 기입해 주실 수 있으면 다행입니다.
끝까지 읽어 주셔서 감사합니다.
Reference
이 문제에 관하여(정점 위치 취득의 처리 속도를 높이는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/d658t/items/0b40a49cbc935e9937a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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로 처리하는 것보다 상당히 빠르거나, 리스트를 줄 때도 중복을 생략하는 것으로 빨라지는 일이 있습니다.
자신이 보는 한, 공식 문서로 그 인수가 리스트 가능한가 어떤가를 확인할 수 없기 때문에, 테스트해 볼 수밖에 없는 것이 귀찮습니다…
만약 기사내에서 실수나 불명점등 있으면 기입해 주실 수 있으면 다행입니다.
끝까지 읽어 주셔서 감사합니다.
Reference
이 문제에 관하여(정점 위치 취득의 처리 속도를 높이는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/d658t/items/0b40a49cbc935e9937a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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)
단지 반환되는 값을 보면 1차원 배열로 되어 있으므로 for로 처리했을 때와 같은 값을 반환하려면 아래 코드를 추가하여 XYZ별 2차원 배열로 바꿔야 합니다.
vert_pos = [vert_pos[i:i + 3] for i in range(0, len(vert_pos), 3)]
요약
이상, 정점 위치 취득의 처리 속도를 높이는 방법을 올리는 방법이었습니다.
굉장히 소립인 기사입니다만, 자신에게 있어서는 발견이었으므로 메모가 굳이 써 주셨습니다.
Maya는 이러한 리스트를 인수에 취할 수 있는 함수가 있어, for로 처리하는 것보다 상당히 빠르거나, 리스트를 줄 때도 중복을 생략하는 것으로 빨라지는 일이 있습니다.
자신이 보는 한, 공식 문서로 그 인수가 리스트 가능한가 어떤가를 확인할 수 없기 때문에, 테스트해 볼 수밖에 없는 것이 귀찮습니다…
만약 기사내에서 실수나 불명점등 있으면 기입해 주실 수 있으면 다행입니다.
끝까지 읽어 주셔서 감사합니다.
Reference
이 문제에 관하여(정점 위치 취득의 처리 속도를 높이는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/d658t/items/0b40a49cbc935e9937a2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(정점 위치 취득의 처리 속도를 높이는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/d658t/items/0b40a49cbc935e9937a2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)