Получить положение объекта в системе координат другого объекта

Есть ли способ в MEL или Python в Maya получить положение одного объекта в системе координат другого объекта? У меня есть камера в сцене, которую можно вращать в любом направлении, и я пытаюсь измерить расстояние по ее локальной оси Z до вершин различных объектов в сцене. Очевидно, что это должно быть быстро, поскольку, скорее всего, он будет выполняться тысячи раз через сцену.

В Maxscript команда будет выглядеть примерно так:

" in coordsys $camera " 

но мне еще предстоит найти что-то подобное в Maya. Если для этого нет прямой команды, есть ли у кого-нибудь способ вычислить это с помощью матричной математики?


person Mike McReynolds    schedule 14.11.2017    source источник
comment
вы пытаетесь найти объекты в пирамиде камеры?   -  person Achayan    schedule 14.11.2017
comment
В моем приложении нет необходимости определять, находится ли объект внутри усеченной пирамиды камеры, мне просто нужно выяснить, как далеко (в локальном z камеры) объект или вершина находится от камеры.   -  person Mike McReynolds    schedule 14.11.2017


Ответы (2)


Не существует единого лайнера, похожего на идиому MXS, и нет простого способа сделать это в mel. Однако в Python вы можете сделать это довольно легко.

Сначала вам нужно получить матрицу для системы координат, которую вы хотите, как MMatrix, которая является частью OpenMaya api. Затем получите позицию, которую хотите проверить, как MPoint, то есть еще один класс api. Вот самый дешевый способ их получить (есть более быстрые методы, но они намного многословнее):

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)

Результатом будет MPoint с 4 числами (x, y, z и w); 4-й всегда будет 1, так что вы можете просто проигнорировать его, хотя математике он нужен для учета масштабов и ножниц.

person theodox    schedule 15.11.2017
comment
Спасибо, отлично. И объяснение очень полезно, я еще не много писал сценарии OpenMaya. Есть ли в Интернете какие-либо ресурсы для его использования? - person Mike McReynolds; 16.11.2017

Используйте этот сценарий MEL для вычисления расстояния от camera1 до nurbsSphere1 примитива:

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

Напечатанный результат должен быть таким:

# MEL 40.1965

Или используйте этот скрипт Python для вычисления расстояния от camera1 до 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
person Andy Fedoroff    schedule 15.11.2017
comment
Это измеряет расстояние от одного объекта до другого, верно? К сожалению, это не совсем то, что мне нужно. Мне нужно узнать координаты перемещения сферы (в частности, ее положение по оси Z) в системе координат камеры. - person Mike McReynolds; 15.11.2017
comment
Используйте эту ссылку, чтобы погрузиться в тему: forum.cgsociety.org/archive /index.php?t-1072860.html Это сложная тема. - person Andy Fedoroff; 15.11.2017