Получение поворота с помощью distanceDimension в Maya с помощью Python - PullRequest
0 голосов
/ 10 мая 2018

Я делаю сценарий, в котором я могу разместить 2 локатора, а между двумя локаторами я делаю свет.

В этот момент я могу сделать 2 локатора, когда я нажимаю в области просмотра, и он делает свет с одинаковым расстоянием и положением.

(Для получения расстояния между двумя локаторами я использую команду DistanceDimension)

Но мне тоже нужно такое же вращение. Так что мне нужно вращать свет, когда loc1 выше, чем loc2, но я не знаю, как это сделать.

Может кто-нибудь помочь мне, пожалуйста? Вот скриншот окна просмотра:

https://i.stack.imgur.com/5MAWC.jpg

Мой код:

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)

1 Ответ

0 голосов
/ 11 мая 2018

Вероятно, вам будет проще это делать с ограничениями анимации, чем с математикой.Вы бы указали-ограничили свет для обоих локаторов с одинаковым весом - это поместит его на полпути между ними.Затем прицельтесь, ограничьте его так, чтобы он указывал на одного из них с миром вверх в качестве «бокового вектора» и смещением вращения, чтобы свет не переворачивался (это свет области, да?)

def area_light_between(target1, target2):
    lightShape = cmds.createNode('areaLight')
    lightXform = cmds.listRelatives(lightShape, p=True)

    #You can get the distance manually without creating a distance dimension:
    start = cmds.xform(target1, q=True, t=True)
    end = cmds.xform(target2, q=True, t=True)
    difference = [end[k] - start[k] for k in range(3)] 
    distance = math.sqrt(difference[0]**2 + difference[1]**2 +  difference[2]**2) 
    cmds.xform(lightXform, s = (distance / 2.0, 0.1, 1))


    # constrain the light between the targets
    # use the mo=False flag so you don't keep the offset
    cmds.pointConstraint(target1, target2,lightXform,  mo = False)

    # add the aim constraint (your world-up vector may vary)
    cmds.aimConstraint(target2, lightXform, worldUpVector = (0,0,1), aimVector=(1,0,0), upVector = (0,0,1), mo = False) 

    return lightXform

area_light_between('pSphere1', 'pSphere2')

Myсцена - Z-Up, поэтому я должен указать вектор увеличения (0,0,1) - если вы используете Y-up vanilla Maya, ваш worldUpVector будет (0,1,0).Как и в любой ситуации ограничения цели, вы получите переворот, если вектор цели окажется слишком близко к вектору вверх - вам придется справиться с этим, если вы сделаете это таким образом или с чистой математикой.

Один хорошийПреимущество этого состоит в том, что вы можете редактировать ограничения после факта, чтобы сместить позицию или цель, сохраняя при этом общие отношения.

...