<p>我想我会发布我正在使用的玛雅代码。显然,在maya中有一个正交属性,它可以帮助根据derhass的答案计算这个称为“正交宽度”(orthographic Width)。</p>
<pre><code># Get view matrix.
view = OpenMayaUI.M3dView.active3dView()
mayaProjMatrix = OpenMaya.MMatrix()
view.projectionMatrix(mayaProjMatrix)
# Get camera MFnDagPath.
dagCam = OpenMaya.MDagPath()
view.getCamera(dagCam)
width = float(view.portWidth())
height = float(view.portHeight())
aspect = width/height
n = cmds.getAttr("%s.nearClipPlane" % dagCam.fullPathName())
f = cmds.getAttr("%s.farClipPlane" % dagCam.fullPathName())
w = 2.0/cmds.getAttr("%s.orthographicWidth" % dagCam.fullPathName())
h = w * aspect
z = -2.0/(f-n)
v = -1.0 * ((f + n) / (f-n))
mat = [0.0] * 16
mat[0] = w
mat[1] = 0.0
mat[2] = 0.0
mat[3] = 0.0
mat[4] = 0.0
mat[5] = h
mat[6] = 0.0
mat[7] = 0.0
mat[8] = 0.0
mat[9] = 0.0
mat[10] = z
mat[11] = 0.0
mat[12] = 0.0
mat[13] = 0.0
mat[14] = v
mat[15] = 1.0
projMatrix = OpenMaya.MMatrix()
OpenMaya.MScriptUtil().createMatrixFromList(mat, projMatrix)
print("\nMaya Projection:")
for x in xrange(0, 4):
print(round(mayaProjMatrix(x, 0), 9),
round(mayaProjMatrix(x, 1), 9),
round(mayaProjMatrix(x, 2), 9),
round(mayaProjMatrix(x, 3), 9))
print("\nMy Projection:")
for x in xrange(0, 4):
print(round(projMatrix(x, 0), 9),
round(projMatrix(x, 1), 9),
round(projMatrix(x, 2), 9),
round(projMatrix(x, 3), 9))
Maya Projection:
(0.04116922, 0.0, 0.0, 0.0)
(0.0, 0.061226019, 0.0, 0.0)
(0.0, 0.0, -0.000200002, 0.0)
(0.0, 0.0, -1.00002, 1.0)
My Projection:
(0.04116922, 0.0, 0.0, 0.0)
(0.0, 0.061226019, 0.0, 0.0)
(0.0, 0.0, -0.000200002, 0.0)
(0.0, 0.0, -1.00002, 1.0)
</code></pre>