Maya命令库似乎不喜欢使用python中内置的decimal模块。为了精确起见,我尝试用任意大的浮点来缩放对象。关于你不能用十进制的“对象”来衡量的理解是清楚的。在
我一直很难解决数学问题,当我输入长浮点数时,它工作得很好。只要它是十进制的对象,玛雅就不会有它。在
所以也许有一种方法可以欺骗你玛雅.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()
注意:在运行脚本之前选择2个顶点。在
干杯
Maya的原生精度通常基于32位浮点(对于大多数线性距离和通用数学)和64位双精度(主要用于角度值)。Python浮动基本上是双倍的,所以它们应该是“无损”的,但我从来没有尝试过检查Python和C++版本没有因为实现细节而有点偏离。在
您可以将这些转换为float以与一起使用玛雅.cmds使用
float()
内置:maya python api是围绕默认的python浮动构建的,因此传入到maya的任何数字在使用前都必须转换为浮点(可以使用
float()
进行此操作)。这种转换是有损的,但只要你是一致的就不重要了,因为Maya最多只能有64位精度。您可以对您控制的任何内容进行十进制数学运算,但maya场景中的最终表示将始终限制为64位限制。在如果遇到精度问题,可以通过在Maya中仔细选择正确的单位比例来获得更好的运气。Maya的内部工作方式始终以厘米为单位:表示“1单位=1英尺”或“1单位=1公里”的部分位于UI中,但转换可能会导致精度问题。如果有疑问,请以厘米为单位离开UI,这样就不会有额外的转换操作来搅浑水。在
相关问题 更多 >
编程相关推荐