玛雅Python。。。在使用玛雅.cmds

2024-09-29 00:22:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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个顶点。在

干杯


Tags: 对象truebyonaxmcbzdec
1条回答
网友
1楼 · 发布于 2024-09-29 00:22:49

Maya的原生精度通常基于32位浮点(对于大多数线性距离和通用数学)和64位双精度(主要用于角度值)。Python浮动基本上是双倍的,所以它们应该是“无损”的,但我从来没有尝试过检查Python和C++版本没有因为实现细节而有点偏离。在

您可以将这些转换为float以与一起使用玛雅.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,这样就不会有额外的转换操作来搅浑水。在

相关问题 更多 >