回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我正在maya中尝试一个脚本,看看我是否可以得到重力和其他一些球形物体,目前它工作得很好(尝试了使月球和地球按比例缩放并校准重力效果),但我想尝试更进一步,并添加碰撞,使对象彼此反弹,但是昨天在四处找了很久,我发现二维物体已经够难的了,更不用说3d了。<br/><br/>
我已经设法写了一点,可以检测到碰撞,在那里它得到两个物体之间的距离,并将它与两个物体的半径进行比较,这似乎是可行的(虽然需要重写),但我不知道下一步该怎么做。老实说,我甚至不确定是否有可能在没有先进的大学知识的情况下完成这样的事情,这就是我最终放弃的原因:P<br/><br/>
为了了解它是如何工作的,这里是主要部分的当前阶段-objSel[j]是当前选定的对象,allObjects是除了当前选定对象之外的所有内容</p>
<pre><code>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.<a href="https://www.cnpython.com/list/append" class="inner-link">append</a>( 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
</code></pre>