我在我的代码中有一个部分,我有两个粒子在弹性碰撞中相撞。我知道这两个粒子的质量和半径。我知道两个粒子碰撞时的中心点。我知道这两个粒子的速度(包括方向)。我想知道的是碰撞后两个粒子的速度(包括方向),我想以有效的方式计算它。我知道这比一个计算机编程更像一个物理问题,但程序员似乎总是能找到最有效的方式做事。我用C++编程。我希望能得到任何帮助,甚至只是指引我朝着正确的方向前进。感谢您的帮助!编程3d粒子碰撞
Q
编程3d粒子碰撞
0
A
回答
0
1
确切的解决方案可以通过数学软件(Mathematica,sagemath..etc)来解决。在这里我使用了python软件包sympy。该算法使用Gröbner基和Buchberger算法,它可以求解多项式方程组。
弹性碰撞的方程式为1)动量守恒,每一个维度2)能量守恒。 3)第一颗粒的碰撞后的速度是在一个指定的单位矢量
方程看起来像这样的方向:
为uij:碰撞前的第i个粒子的速度的第j个分量。
vij:碰撞后第i个粒子速度的第j个分量。
N:所述单位矢量指向在第一粒子的速度的方向后碰撞
吨:第一粒子的速度的碰撞后的大小
米:质量
from sympy import *
u11,u12,u13 = symbols('u11 u12 u13')
u21,u22,u23 = symbols('u21 u22 u23')
v11,v12,v13 = symbols('v11 v12 v13')
v21,v22,v23 = symbols('v21 v22 v23')
n1,n2,n3,t= symbols('n1 n2 n3 t')
m1,m2 = symbols('m1 m2')
p1 = m1*u11 +m2*u21 - m1*v11 -m2*v21
p2 = m1*u12 +m2*u22 - m1*v12 -m2*v22
p3 = m1*u13 +m2*u23 - m1*v13 -m2*v23
e = m1*(u11**2+ u12**2 +u13**2) + m2*(u21**2+ u22**2+ u23**2) \
-(m1*(v11**2+ v12**2 +v13**2) + m2*(v21**2+ v22**2+ v23**2))
d1 =v11 - t*n1
d2 =v12 - t*n2
d3 =v13 - t*n3
s = solve([p1,p2,p3,e,d1,d2,d3], v11,v12,v13,v21,v22,v23,t, set=True)
的解决方案是:[吨,V11,V12,V13,V21,V22,V23]
2*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2)/(2*m1*n1**2 + 2*m1*n2**2 + 2*m1*n3**2 + 2*m2*n1**2 + 2*m2*n2**2 + 2*m2*n3**2) + (m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23)/((m1 + m2)*(n1**2 + n2**2 + n3**2))
n1*(m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23 + sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2))/(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2)
n2*(m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23 + sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2))/(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2)
n3*(m1*n1*u11 + m1*n2*u12 + m1*n3*u13 + m2*n1*u21 + m2*n2*u22 + m2*n3*u23 + sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2))/(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2)
(-m1**2*n1*n2*u12 - m1**2*n1*n3*u13 + m1**2*n2**2*u11 + m1**2*n3**2*u11 + m1*m2*n1**2*u11 - m1*m2*n1*n2*u22 - m1*m2*n1*n3*u23 + m1*m2*n2**2*u11 + m1*m2*n2**2*u21 + m1*m2*n3**2*u11 + m1*m2*n3**2*u21 - m1*n1*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2) + m2**2*n1**2*u21 + m2**2*n2**2*u21 + m2**2*n3**2*u21)/(m2*(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2))
(m1**2*n1**2*u12 - m1**2*n1*n2*u11 - m1**2*n2*n3*u13 + m1**2*n3**2*u12 + m1*m2*n1**2*u12 + m1*m2*n1**2*u22 - m1*m2*n1*n2*u21 + m1*m2*n2**2*u12 - m1*m2*n2*n3*u23 + m1*m2*n3**2*u12 + m1*m2*n3**2*u22 - m1*n2*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2) + m2**2*n1**2*u22 + m2**2*n2**2*u22 + m2**2*n3**2*u22)/(m2*(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2))
(m1**2*n1**2*u13 - m1**2*n1*n3*u11 + m1**2*n2**2*u13 - m1**2*n2*n3*u12 + m1*m2*n1**2*u13 + m1*m2*n1**2*u23 - m1*m2*n1*n3*u21 + m1*m2*n2**2*u13 + m1*m2*n2**2*u23 - m1*m2*n2*n3*u22 + m1*m2*n3**2*u13 - m1*n3*sqrt(-m1**2*n1**2*u12**2 - m1**2*n1**2*u13**2 + 2*m1**2*n1*n2*u11*u12 + 2*m1**2*n1*n3*u11*u13 - m1**2*n2**2*u11**2 - m1**2*n2**2*u13**2 + 2*m1**2*n2*n3*u12*u13 - m1**2*n3**2*u11**2 - m1**2*n3**2*u12**2 - 2*m1*m2*n1**2*u12*u22 - 2*m1*m2*n1**2*u13*u23 + 2*m1*m2*n1*n2*u11*u22 + 2*m1*m2*n1*n2*u12*u21 + 2*m1*m2*n1*n3*u11*u23 + 2*m1*m2*n1*n3*u13*u21 - 2*m1*m2*n2**2*u11*u21 - 2*m1*m2*n2**2*u13*u23 + 2*m1*m2*n2*n3*u12*u23 + 2*m1*m2*n2*n3*u13*u22 - 2*m1*m2*n3**2*u11*u21 - 2*m1*m2*n3**2*u12*u22 + m2**2*n1**2*u11**2 - 2*m2**2*n1**2*u11*u21 + m2**2*n1**2*u12**2 - 2*m2**2*n1**2*u12*u22 + m2**2*n1**2*u13**2 - 2*m2**2*n1**2*u13*u23 + m2**2*n1**2*u21**2 + 2*m2**2*n1*n2*u21*u22 + 2*m2**2*n1*n3*u21*u23 + m2**2*n2**2*u11**2 - 2*m2**2*n2**2*u11*u21 + m2**2*n2**2*u12**2 - 2*m2**2*n2**2*u12*u22 + m2**2*n2**2*u13**2 - 2*m2**2*n2**2*u13*u23 + m2**2*n2**2*u22**2 + 2*m2**2*n2*n3*u22*u23 + m2**2*n3**2*u11**2 - 2*m2**2*n3**2*u11*u21 + m2**2*n3**2*u12**2 - 2*m2**2*n3**2*u12*u22 + m2**2*n3**2*u13**2 - 2*m2**2*n3**2*u13*u23 + m2**2*n3**2*u23**2) + m2**2*n1**2*u23 + m2**2*n2**2*u23 + m2**2*n3**2*u23)/(m2*(m1*n1**2 + m1*n2**2 + m1*n3**2 + m2*n1**2 + m2*n2**2 + m2*n3**2))
相关问题
- 1. 粒子碰撞
- 2. AndEngine粒子碰撞
- 3. 粒子(布)与球碰撞
- 4. Unity - 棘手的粒子碰撞
- 5. Java OpenGL 3D碰撞
- 6. 的Python:最佳颗粒自碰撞/三角形碰撞算法
- 7. 3D粒子球
- 8. LWJGL 3D碰撞检测
- 9. Java-3d碰撞检测
- 10. OpenGL中的3D碰撞
- 11. Unity 3D对象碰撞
- 12. 在3D中实现碰撞
- 13. OpenGL 3D碰撞检测
- 14. 边界框碰撞-3D XNA
- 15. LibGDX 3D碰撞检测
- 16. C#碰撞编程 - 动量
- 17. 子弹碰撞
- 18. 3D碰撞网格(更有效的碰撞计算)
- 19. Andengine粒子碰撞的影响(安卓游戏开发)
- 20. Unity 2D粒子碰撞没有得到事件
- 21. 检测碰撞的粒子和风力作用
- 22. 粒子效果像chillingo的碰撞效果
- 23. 为什么我的粒子系统碰撞不起作用?
- 24. 使用Cocos2d中的粒子进行碰撞检测
- 25. 在JavaScript/canvas粒子系统中处理碰撞
- 26. 点三角形碰撞检测的3D
- 27. XNA 4.0中的3D碰撞检测
- 28. xna 4.0 3D碰撞的方法?
- 29. 相机在统一碰撞3d
- 30. java-3d中的碰撞检测?
读我[本](http://www.gamasutra.com/view/feature/131424/pool_hall_lessons_fast_accurate_.php?page=1)的方式回来的时候,IIRC是准确和有用的。但关闭主题。 – GManNickG