Maya Python...使用 maya.cmds 编码时任意精度的解决方法

Maya Python... workaround for arbitrary precision when coding with maya.cmds

Maya 命令库似乎不喜欢使用 python 中的内置十进制模块。我试图通过任意大的浮点数来缩放对象以提高精度。据了解你不能按小数点缩放 'object' 是清楚的。

我一直在计算数学题,当我输入长浮点数时它工作正常。一旦它是十进制对象,maya 就不会拥有它。

所以也许有一种方法可以欺骗 maya.cmds 模块,该模块将长浮点数输入到比例函数中。有没有

以下是根据对象上两个顶点之间的距离缩放对象的脚本。

代码如下:

##  ((Ax - Bx)**2 + (Ay - By)**2 + (Az - Bz)**2)**0.5

import maya.cmds as mc
import decimal as dec
dec.getcontext().prec = 100 # arbitrary precision for floats

selPoints = mc.ls(sl = True)
objName = selPoints[0].split('.')[0]
print objName
vtxCoordList = mc.xform(selPoints, q = True, translation = True, ws = True)
Ax, Ay, Az = vtxCoordList[:-3]
Bx, By, Bz = vtxCoordList[3:]
d = dec.Decimal(((Ax - Bx)**2 + (Ay - By)**2 + (Az - Bz)**2)**0.5) #direct distance between both points

def getDist(*args):
    selPoints = mc.ls(sl = True)


    vtxCoordList = mc.xform(selPoints, q = True, translation = True, ws = True)
    Ax, Ay, Az = vtxCoordList[:-3]
    Bx, By, Bz = vtxCoordList[3:]
    d = dec.Decimal(((Ax - Bx)**2 + (Ay - By)**2 + (Az - Bz)**2)**0.5) #direct distance between both points
    dx = ((Ax - Bx)**2)**0.5
    print "Distance on X axis is: {0}".format(dx) #distance on X axis
    dy = ((Ay - By)**2)**0.5
    print "Distance on Y axis is: {0}".format(dy) #distance on Y axis
    dz = ((Az - Bz)**2)**0.5
    print "Distance on Z axis is: {0}".format(dz) #distance on Z axis
    mc.textFieldButtonGrp("currentLength", edit = True, tx = "{0}".format(d))    

## scale object to match measurement
def scaleDist():
    userInput = mc.textFieldButtonGrp("desiredLength",q = True, tx = True)
    scaleFactor = dec.Decimal(userInput)/dec.Decimal(d)

    mc.scale(dec.Decimal(scaleFactor), dec.Decimal(scaleFactor), dec.Decimal(scaleFactor), objName)

## window
mc.window("Distance Tool", t = "Distance Tool")
mc.rowColumnLayout(numberOfColumns = 2, columnAttach = (1, 'left', 0), columnWidth = [(1,100), (2,300)])
mc.text(l = "Current length")
currentLength = mc.textFieldButtonGrp("currentLength", ed = False, tx = "{0}".format(d), buttonLabel = "Refresh", bc = getDist)

mc.text(l = "Desired length")
desiredLength = mc.textFieldButtonGrp("desiredLength", buttonLabel = "Scale", bc = scaleDist)
mc.showWindow()

注意:select 脚本前 运行 2 个顶点。

干杯

Maya 的原生精度通常基于 32 位浮点数(用于大多数线性距离和通用数学)和 64 位双精度数(主要用于 angular 值)。 Python 浮点数基本上是双精度数,因此出于所有实际目的它们应该是 'lossless' 尽管我从未尝试检查 python 和 C++ 版本是否由于实现而有一点偏差细节。

您可以将它们转换为浮点数以供 maya.cmds 使用 float() 内置函数:

dec = Decimal(1.0000000001)
flt = float(dec)
cmds.xform('pCube1', t = (flt, flt, flt))

maya python api 是围绕默认 python 浮点数构建的,因此您传递给 maya 的任何数字都必须在使用前转换为浮点数(您可以这样做float())。这种转换是有损的,但只要您保持一致就没有关系,因为 Maya 最多只能使用 64 位精度。您可以对您控制的任何内容进行十进制数学运算,但 Maya 场景中的最终表示将始终被限制为 64 位限制。

如果您 运行 遇到精度问题,那么在 Maya 中仔细选择正确的单位比例可能会好运。 Maya 的内部工作始终以厘米为单位:表示“1 单位 = 1 英尺”或“1 单位 = 1 公里”的部分在 UI 中,但转换可能会导致精度问题。如有疑问,请以厘米为单位保留 UI,这样就不会进行额外的转换操作。