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,这样就不会进行额外的转换操作。
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,这样就不会进行额外的转换操作。