Maya でスクリプトを試して、重力とそのロットが球体オブジェクトで動作するかどうかを確認していますが、現在は正常に動作しています (月と地球をスケーリングして重力効果を調整してみました)。さらに一歩進んで衝突を追加して、オブジェクトが互いに跳ね返るのを試みるのが好きですが、昨日長い間見回した後、3D を気にせずに 2D オブジェクトで十分に難しいことがわかりました。
両方のオブジェクト間の距離を取得し、それを両方のオブジェクトの半径と比較する衝突を検出できるビットを書くことができました。次にすること。正直なところ、それが正しいかどうかさえわかりません」
それがどのように機能するかを理解するために、メイン パーツの現在の段階を次に示します。objSel[j] は現在選択されているオブジェクトであり、allObjects は現在選択されているオブジェクト以外のすべてです。
def moveObjects(originalTime,objSel,objMultiplySize):
moveAmounts = []
crashed = False
for j in range(len(objSel)):
#get initial values
originalVelocity = getVelocity(objSel[j],originalTime,objMultiplySize)
objVolume = getVolume(objSel[j],objMultiplySize)
allObjects = selectAllOtherObjects(objSel[j], objSel)
#calculate gravity effect on object
xDist = 0
yDist = 0
zDist = 0
for i in range (0, len(allObjects) ):
attraction = calcuateForce(objSel[j],allObjects[i],objMultiplySize)
distanceFromObj = getDistance(allObjects[i],objSel[j],objMultiplySize)[1]
xDist += distanceFromObj[0] * attraction / (objVolume*2.15*math.pi)
yDist += distanceFromObj[1] * attraction / (objVolume*2.15*math.pi)
zDist += distanceFromObj[2] * attraction / (objVolume*2.15*math.pi)
gravityEffect = [xDist,yDist,zDist]
newX = (originalVelocity[0]+gravityEffect[0])/objMultiplySize
newY = (originalVelocity[1]+gravityEffect[1])/objMultiplySize
newZ = (originalVelocity[2]+gravityEffect[2])/objMultiplySize
newVelocity = [newX,newY,newZ]
moveAmounts.append( newVelocity )
#-----------this whole bit needs rewriting--------
py.currentTime( originalTime + 1, edit = True, update = True)
for j in range(len(moveAmounts)):
#collision detection
allObjects = selectAllOtherObjects(objSel[j], objSel)
originalRadius = getRadius(objSel[j],objMultiplySize)
for i in range (0, len(allObjects) ):
objRadius = getRadius(allObjects[i],objMultiplySize)
objDistance = getDistance(allObjects[i],objSel[j],objMultiplySize)
if objDistance[0] < objRadius + originalRadius:
force1 = moveAmounts[j][0]*objMultiplySize * objRadius
print "Crashed"
crashed = True
if crashed != True:
#move object
py.move( objSel[j], float(moveAmounts[j][0]), float(moveAmounts[j][1]), float(moveAmounts[j][2]), relative = True )
py.setKeyframe( objSel[j], attribute='translateX')
py.setKeyframe( objSel[j], attribute='translateY')
py.setKeyframe( objSel[j], attribute='translateZ')
else:
#dunno what to do here
for i in range (0, len(allObjects) ):
mass1 = getVolume(allObjects[i],objMultiplySize)
velocity1 = getVelocity(allObjects[i],originalTime,objMultiplySize)
mass2 = getVolume(objSel[j],objMultiplySize)
velocity2 = getVelocity(objSel[j],originalTime,objMultiplySize)
m1v1m2v2X = mass1*velocity1[0] + mass2*velocity2[0]
m1v1m2v2Y = mass1*velocity1[1] + mass2*velocity2[1]
m1v1m2v2Z = mass1*velocity1[2] + mass2*velocity2[2]
totalMass = mass1+mass2