Да, точно) Вот только не знаю, правильно ли я решил эту проблему, однако всё работает)
ProcedureDLL.f dpUpdateCollisions()
Protected num0.i
For num0 = 0 To (num - 1)
FindMapElement(Objects(),Str(num0))
Protected numA.i = Objects()\num
Protected xPosA.f = Objects()\xPos
Protected yPosA.f = Objects()\yPos
Protected zPosA.f = Objects()\zPos
Protected s.f
For numB = 0 To (num - 1)
FindMapElement(Objects(),Str(numB))
If Not numB = numA
Protected xPosB.f = Objects()\xPos
Protected yPosB.f = Objects()\yPos
Protected zPosB.f = Objects()\zPos
s = Sqr(Pow(xPosA - xPosB,2) + Pow(yPosA - yPosB,2) + Pow(zPosA - zPosB,2))
If s <= 2
vxB.f = Objects()\xSp
vyB.f = Objects()\ySp
vzB.f = Objects()\zSp
massB.f = Objects()\mass
FindMapElement(Objects(),Str(numA))
vxA.f = Objects()\xSp
vyA.f = Objects()\ySp
vzA.f = Objects()\zSp
massA.f = Objects()\mass
NEWvxA.f = ((massA - massB) * vxA + 2 * massB * vxB) / (massA + massB)
NEWvyA.f = ((massA - massB) * vyA + 2 * massB * vyB) / (massA + massB)
NEWvzA.f = ((massA - massB) * vzA + 2 * massB * vzB) / (massA + massB)
Objects()\xSp = NEWvxA
Objects()\ySp = NEWvyA
Objects()\zSp = NEWvzA
Objects()\xPos = Objects()\xPos + Objects()\xSp
Objects()\yPos = Objects()\yPos + Objects()\ySp
Objects()\zPos = Objects()\zPos + Objects()\zSp
FindMapElement(Objects(),Str(numB))
NEWvxB.f = ((massB - massA) * vxB + 2 * massA * vxA) / (massA + massB)
NEWvyB.f = ((massB - massA) * vyB + 2 * massA * vyA) / (massA + massB)
NEWvzB.f = ((massB - massA) * vzB + 2 * massA * vzA) / (massA + massB)
Objects()\xSp = NEWvxB
Objects()\ySp = NEWvyB
Objects()\zSp = NEWvzB
Objects()\xPos = Objects()\xPos + Objects()\xSp
Objects()\yPos = Objects()\yPos + Objects()\ySp
Objects()\zPos = Objects()\zPos + Objects()\zSp
EndIf
EndIf
Next
Next
EndProcedure
Скорость необходимо присваивать сразу обоим телам, а после - отодвигать их на расстояние, равное скорости.