Я пытаюсь создать сценарий в майа, чтобы узнать, могу ли я получить гравитацию и этот участок, работающий со сферическими объектами, и в настоящее время он отлично работает (пытался сделать луну и землю масштабировать и откалибровать гравитацию к этому), но я хотел бы попытаться сделать это еще дальше и добавить коллизии, чтобы объекты отскакивали друг от друга, но, оглядевсь по сторонам вчера, я обнаружил, что это сложно с объектами 2d, не говоря уже о 3d.
Мне удалось написать бит, который может обнаружить столкновение, где он получает расстояние между обоими объектами и сравнивает его с радиусом обоих объектов, который, кажется, работает (требуется переписать хотя), но я не мог выяснить, что делать дальше. Честно говоря, я даже не уверен, что это возможно сделать с чем-то вроде этого без каких-либо передовых университетских знаний, поэтому я в конце концов отказался от этого: P
Просто для того, чтобы понять, как это работает, вот текущий этап основная часть - objSel [у] является текущим выбранным объектом, AllObjects все, кроме текущего выбранного объектаУравнение столкновений для двух 3D-объектов
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
Эй, жаль, что так долго не было ответа, но спасибо большое, именно то, что я искал (я думаю): DI пытался сделать расчет m1 * v1 + m2 * v2, но не мог понять, как Чтобы решить эту проблему: p Сначала мне нужно переписать часть кода, но прежде чем я смогу ее протестировать, но это не должно быть слишком сложно, поэтому я надеюсь, что это сработает; D – Peter