2017-11-14 4 views
1

Maya의 MEL 또는 Python에서 다른 객체의 좌표계에서 한 객체의 위치를 ​​얻는 방법이 있습니까? 어떤 방향으로도 회전 할 수있는 장면의 카메라가 있는데 장면의 여러 오브젝트의 꼭지점까지 로컬 Z 축의 거리를 측정하려고합니다. 이것은 장면 전체에서 수천 번 실행되기 때문에 분명히 빠를 필요가 있습니다.다른 객체의 좌표계에서 객체의 위치 가져 오기

MAXScript를에서 명령이

" in coordsys $camera " 

같은 것 그러나 나는 마야이 같은 뭔가를 찾을 못하고있다. 이를 수행 할 직접 명령이 없다면 누군가 행렬 연산을 사용하여 계산할 방법이 있습니까?

+0

카메라 절두체에서 물체를 찾으려고합니까? – Achayan

+0

개체가 카메라 절두체 안쪽에 있는지 여부는 내 응용 프로그램에서 필요하지 않습니다. 개체 또는 정점이 카메라에서 얼마나 멀리 있는지 (카메라의 로컬 z에서) 알아야합니다. –

답변

0

는 MXS 관용구와 유사한 아무도 라이너 없다 - 그리고 에서 할 수있는 쉬운 방법. 그러나 파이썬에서는 이것을 매우 쉽게 할 수 있습니다.

먼저 좌표계의 행렬을 OpenMaya API의 일부인 MMatrix으로 가져와야합니다. 그런 다음 다른 api 클래스 인 MPoint로 확인하려는 위치를 얻습니다. 여기를 얻을 수있는 저렴한 방법입니다 (이 빠른 방법은 있지만 많은 wordier있어) : 당신은 매트릭스 점을 일단

from maya.api.OpenMaya import MVector, MMatrix, MPoint 
import maya.cmds as cmds 

def world_matrix(obj): 
    """' 
    convenience method to get the world matrix of <obj> as a matrix object 
    """ 
    return MMatrix(cmds.xform(obj, q=True, matrix=True, ws=True)) 


def world_pos(obj): 
    """' 
    convenience method to get the world position of <obj> as an MPoint 
    """ 
    return MPoint(cmds.xform(obj, q=True, t=True, ws=True)) 

, 상대적 위치는 단순히 배를 행렬의 역 지점 :

relative_position = world_pos('pSphere1') * world_matrix('pCube1').inverse() 
print relative_position 
# (0.756766, -0.0498943, 3.38499, 1) 

결과 4 번호 (X, Y, Z 및 W)을 갖는 MPOINT 될 것이다; 수학은 항상 비늘과 가위를 설명하기 위해 필요하지만, 4 번째 항은 항상 1이 될 것이므로 무시할 수 있습니다.

+0

고맙습니다. 그리고 설명은 매우 유용합니다. 아직 OpenMaya 스크립팅을 많이하지 않았습니다. 온라인 리소스가 있습니까? –

0

camera1에서 nurbsSphere1 원시적까지의 거리를 계산하기 위해이 MEL 스크립트를 사용

# MEL 40.1965 

또는 camera1에서 거리를 계산하기 위해 파이썬 스크립트를 사용

vector $p1 = `getAttr camera1.translate`; 
vector $p2 = `getAttr nurbsSphere1.translate`; 
vector $result = $p1 - $p2; 
print (mag($result)) 

인쇄 결과는 다음과 같이해야합니다 ~ nurbsSphere1 프리미티브 :

import maya.cmds as cmds 
import math 

distance = math.sqrt(pow((float)(cmds.getAttr("nurbsSphere1.tx") - cmds.getAttr("camera1.tx")),2) + 
        pow((float)(cmds.getAttr("nurbsSphere1.ty") - cmds.getAttr("camera1.ty")),2) + 
        pow((float)(cmds.getAttr("nurbsSphere1.tz") - cmds.getAttr("camera1.tz")),2)) 
print(distance) 

인쇄 결과는 다음과 같이해야합니다 :

# Python 40.1964998512 
+0

이것은 한 물체에서 다른 물체까지의 거리를 측정합니다. 맞습니까? 그건 내가 불행히도 필요한 것이 아니다. 카메라의 좌표계에서 영역의 변환 좌표 (특히 Z 위치)를 찾아야합니다. –

+0

이 링크를 사용하여 주제에 대해 알아보십시오. http://forums.cgsociety.org/archive/index.php?t-1072860.html 고급 주제입니다. – andy

관련 문제