我正在制作一个脚本,我可以放置2个定位器和2个定位器之间我正在制作一个灯光。在
此时,当我在视口中单击时,我可以制作两个定位器,并且它可以生成具有相同距离和位置的灯光。在
(为了获得两个定位器之间的距离,我使用DistanceDimension命令)
但我也需要同样的旋转。所以当loc1高于loc2时,我也需要旋转我的灯,但我不知道怎么做。在
有人能帮帮我吗?以下是视口的屏幕截图:
我的代码:
import maya.cmds as cmds
def dragger_onPress():
pos = cmds.draggerContext(draggerContextName, query = True, anchorPoint
= True)
#make locator for distance
cmds.spaceLocator(name=('DistnaceLoc'))
cmds.move(pos[0],pos[1],pos[2])
if cmds.objExists('DistnaceLoc') and cmds.objExists('DistnaceLoc1'):
posLoc1_X = cmds.getAttr('DistnaceLoc.translateX')
posLoc1_Y = cmds.getAttr('DistnaceLoc.translateY')
posLoc1_Z = cmds.getAttr('DistnaceLoc.translateZ')
posLoc2_X = cmds.getAttr('DistnaceLoc1.translateX')
posLoc2_Y = cmds.getAttr('DistnaceLoc1.translateY')
posLoc2_Z = cmds.getAttr('DistnaceLoc1.translateZ')
Distance = cmds.distanceDimension(startPoint=
[posLoc1_X,posLoc1_Y,posLoc1_Z],endPoint=[posLoc2_X,posLoc2_Y,posLoc2_Z])
DistanceValue = cmds.getAttr(Distance + '.distance')
print(DistanceValue)
averagePosX = (posLoc1_X+posLoc2_X)/2
averagePosY = (posLoc1_Y+posLoc2_Y)/2
averagePosZ = (posLoc1_Z+posLoc2_Z)/2
#create light
lights.append(cmds.shadingNode('aiAreaLight', asLight=True))
cmds.move(averagePosX,averagePosY,averagePosZ)
cmds.scale((DistanceValue/2),0.1,1)
cmds.delete('DistnaceLoc','DistnaceLoc1')
# for getting the mousepoitionw
if (cmds.contextInfo(draggerContextName, exists = True)):
cmds.deleteUI(draggerContextName, toolContext = True )
cmds.draggerContext(draggerContextName, pressCommand = dragger_onPress2,cursor = "crossHair", space="world",snapping=True)
cmds.setToolTo(draggerContextName)
您可能会发现使用动画约束比使用数学更容易实现这一点。您可以将灯光指向两个定位器,以相等的权重将其放置在它们之间的中间。然后将目标约束为指向其中一个,世界向上作为“侧向量”,并设置旋转偏移以防止灯光翻转(这是区域光,是吗?)在
我的场景是Z向上的,所以我必须指定一个世界上方向向量(0,0,1),如果你使用的是香草玛雅Y-Up,你的世界上方向向量将是(0,1,0)。与任何目标约束情况一样,如果目标向量太接近上方向向量,则会发生翻转。如果使用这种方法或使用纯数学,则必须处理该问题。在
这样做的一个好处是,您可以在事后编辑约束以偏移位置或目标,同时保留整体关系。在
相关问题 更多 >
编程相关推荐