Я думаю, что вы хотите что-то более похожее на это (обратите внимание, я преобразовал его в API 2, чтобы сократить шаблон)
import maya.api.OpenMaya as om
import maya.cmds as cmds
def projectedGridPoint(camera, coord, depth):
selList = om.MGlobal.getSelectionListByName(camera)
dagPath = selList.getDagPath(0)
dagPath.extendToShape()
view = dagPath.inclusiveMatrix()
fnCam = om.MFnCamera(dagPath)
projection = om.MMatrix(fnCam.projectionMatrix())
viewProj = projection * view
r = om.MPoint(coord[0],coord[1], -1 * depth) * projection.inverse()
return r.homogenize() * view
xx, yy = (2, 2)
for y in range(yy):
for x in range(xx):
ndc_x = 2.0 * x / float(xx - 1) - 1
ndc_y = 2.0 * y / float(yy - 1) - 1
coord = ( ndc_x, ndc_y)
pt = projectedGridPoint('camera1', coord,0)
c,_ = cmds.polyCube(w = 0.1, d = 0.1, h = 0.1)
cmds.xform(c, t = (pt[0], pt[1], pt[2]))
Координаты предоставляются в виде нормализованных координат устройства (от -1, -1 до 1, 1 по углам вида), а глубина идет от ближних к дальним плоскостям отсечения - глубина 1 находится прямо на около плоскости, а глубина 0 находится в дальней плоскости. Я думаю, что на практике я бы зафиксировал глубину на 0 и использовал настройку плоскости отсечения на камере, чтобы установить глубину
edit Я рационализировал оригинальный, изящный метод преобразования значений индекса в координаты NDC