我正在编写一个物理引擎/模拟器,它结合了3D太空飞行,行星/恒星引力,船舶推力和相对论效应.到目前为止,它的进展非常顺利,但是,我需要帮助的一件事是碰撞检测算法的数学计算.
我正在使用的运动的迭代模拟基本如下:
(注意:3D矢量是全部大写.)
For each obj
obj.ACC = Sum(all acceleration influences)
obj.POS = obj.POS + (obj.VEL * dT) + (obj.ACC * dT^2)/2 (*EQ.2*)
obj.VEL = obj.VEL + (obj.ACC * dT)
Next
Run Code Online (Sandbox Code Playgroud)
哪里:
obj.ACC is the acceleration vector of the object
obj.POS is the position or location vector of the object
obj.VEL is the velocity vector of the object
obj.Radius is the radius (scalar) of the object
dT is the time delta or increment
Run Code Online (Sandbox Code Playgroud)
我基本上需要做的是找到一个有效的公式,从上面的(EQ.2)派生出两个对象(obj1,obj2),并告诉他们是否碰撞,如果碰到,在什么时候.我需要确切的时间,以便我可以确定它是否在这个特定的时间增量(因为加速器在不同的时间增量会有所不同),并且还可以找到确切的位置(我知道该怎么做,给定时间)
对于这个引擎,我将所有对象建模为球体,所有这些公式/ algortithim需要做的是弄清楚在哪些点:
(obj1.POS - …Run Code Online (Sandbox Code Playgroud) 我正在使用Segment to Segment最接近的方法,它将输出两段长度之间的最近距离.每个段对应于球体对象的起点和终点.速度只是从一个点到另一个点.
即使没有真正的碰撞,最近的方法也能成功.所以,我现在正在使用一个10步法,计算2个球体沿两个部分移动时的距离.因此,基本上每个段的长度是物理步骤中对象的遍历,半径是对象半径.通过踩踏,我可以知道它们碰撞的位置,以及它们是否发生碰撞(排序;对于MOST部分.)
我觉得可能有更好的东西.虽然我有点认为需要第一个最近的接近调用,但我认为紧随其后的方法是TAD弱点.谁能帮我吗?如果需要,我可以说明这一点.
非常感谢! 替代文字http://img444.yfrog.com/img444/6692/caquestion.png
我公司正准备提出一个中风和脑损伤康复工具,我们需要知道什么是自由的,开放源码,并详细记录游戏引擎都在那里.
我倾向于Jake2,因为Java很容易编程,但我需要更多的选择来考虑你们有经验的人.
我一直在寻找创建某种物理模拟的不同方法.我想要做的是在一段时间内在各种力的作用下对身体的运动进行3D建模.我原本看着使用物理引擎(Bullet)和3d引擎(Irrlicht)在c ++中编写代码.但是,我注意到Blender已经允许人们进行物理模拟,因为Bullet与它集成(如果我错了,请纠正我).这似乎可以让我更容易按照我想要的方式设计模拟(使用Blender广泛的GUI).
我的问题是我想使用模拟的结果(基本上是每个时间步的x,y,z,俯仰,滚动,偏航)来输入c/c ++代码(如果它更容易用于其他语言)这个).这可以用Blender完成吗?有没有一个更好的软件包,我忽略了?谢谢,任何建议表示赞赏.
我正在尝试计算2个碰撞球的新速度,但在解决另一个问题之前不能真正做到这一点.
由于在数字世界中几乎从未发生真正的碰撞,我们总是会遇到"碰撞"球重叠的情况.
想象一下,有100个球随机移动,所以,如果我理解正确的话,程序应该如下:
x += vx; y+= vy)如果以上是正确的,那么,我怎么能"及时"将球移动到第一次碰撞点?已知数据:
b[i].x,b[i].y)X和Y速度(b[i].vx,b[i].vy)dist)我应该只计算dist与碰撞的完美距离的百分之几,然后简单地向后移动x并y坐标相同的百分比vx和vy?
我是通过使用维基百科上的基本方程碰撞成对的2D凸对象(无旋转)来计算结果的.但是,当存在依赖关系时,例如两个对象同时命中另一个对象:

例如,在这里,对象1和2在完全相同的时间击中3,成对方法失败.根据我计算碰撞的顺序(先是1-3或先2-3),我会得到不同的结果.通过碰撞的重复迭代仍将给出依赖于顺序的结果.
我已经设置了它,所以我可以弄清楚哪些对象彼此接触,所以我的代码会知道在计算其中一对时,对象3在那一刻与另一个对象发生碰撞(所以1-3碰撞会知道关于2-3碰撞,反之亦然).我也知道边缘/角落与什么接触.
无论什么解决方案都需要健壮...例如,如果设置变得更复杂,就像这两个例子:

这个过程需要能够处理这个问题,甚至更糟.任何可能的同时接触/碰撞链.我将手头上的所有数据描述它们,所以我"只"需要知道如何解决这些系统的一般情况.我目前没有对旋转做任何事情,这简化了事情.
看起来它可能涉及将对象分组在一起,但是由非正交的边缘引起的干扰(参见最后一个带有六边形的示例)似乎会使该方法失败.
我之前看过一个类似的问题,但答案从未被检查过(死胡同?).我不确定冲击传播会如何解决我的第一个例子,因为C在第一次碰撞后就会移开......所以有什么震撼可以传播?编辑:好的,我现在看到同时碰撞和震动传播是两个不同的想法,这就是为什么它看起来没用.
language-agnostic algorithm physics game-physics physics-engine
我正在使用牛顿方程来制作这个程序中的球,我正在解决它们彼此碰撞时"分开",但有时候它们会相互碰撞并导致很多麻烦.
.
这是我的代码:
<center>
<canvas id="canvas" style="border: 2px solid black; cursor: crosshair;" width="1000" height="500"></canvas>
</center>
<script>
var canvas = document.getElementById("canvas")
var ctx = canvas.getContext("2d")
var w = canvas.width
var h = canvas.height
var ball = []
var gravity = 0.3
var force = 0.2
var mouse = {
d: false,
x1: 0,
y1: 0,
x2: 0,
y2: 0,
}
window.onmousedown = function(e) {
mouse.d = true
mouse.x1 = mouse.x2 = e.pageX - canvas.getBoundingClientRect().left
mouse.y1 = mouse.y2 = e.pageY - canvas.getBoundingClientRect().top …Run Code Online (Sandbox Code Playgroud) 是否有可能在python中编写一个函数,可以旋转任何2d结构,参数只是结构中点的坐标(x,y)?轴,速度和方向将包括其他参数.
根据我的理解,只有通过计算从对称点和轴的点距离才能实现,因此它总是会变化,因此除了由标准形状(三角形,矩形,正方形等)组成的2d结构外是不可能的.
很好的例子将不胜感激.
我正在实施Gilbert-Johnson-Keerthi算法,该算法计算两个物体是否相交(即碰撞).
我的代码的入口点是hasCollided函数,它接受两个点列表并True在它们相交时返回.我相信我已经正确地实现了论文 - 但是,我仍然需要实现这个contains功能.
该contains函数应确定单纯形是否包含原点.我不确定如何实现这一点.
如何有效地确定单形(点集合)是否包含原点?
以下是我的实施:
type Simplex = Set (Vector Double)
hasCollided :: [Vector Double] -> [Vector Double] -> Bool
hasCollided points1 points2 = gjk points1 points2 simplex (scale (-1) direction) p
where simplex = insert p empty
p = support points1 points2 direction
direction = fromList [1, 0, 0]
gjk :: [Vector Double] -> [Vector Double] -> Simplex -> Vector Double -> Vector Double -> Bool
gjk …Run Code Online (Sandbox Code Playgroud) 我的任务是在一个看不见的圆的同心环上产生均匀(或多或少)的间隔点.该函数应该采用半径列表,以及给定半径作为参数绘制的点数.例如,对于半径为0,它应该在(0,0)处绘制1点.对于半径为1的圆,它应沿圆的圆周绘制10个点,间隔2pi/10的角度.对于半径为2的圆,沿圆周的20个点,以2pi/20的角度间隔开.
生成器应采用以下参数:
n,r_max,m
并应在半径处生成坐标对的环
对于i = 0,1,..,n,r_i = i*r_max/n.
每个环应具有均匀分布在θ中的n*i个点,其中对于i = 0,n_i = 1; n_i = mi for i> 0
当像这样调用函数时:
for r, t in genpolar.rtuniform(n=10, rmax=0.1, m=6):
plot(r * cos(t), r * sin(t), 'bo')
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所提出的:
def rtpairs(R, N):
R=[0.0,0.1,0.2]
N=[1,10,20]
r=[]
t=[]
for i in N:
theta=2*np.pi/i
t.append(theta)
for j in R:
j=j
r.append(j)
plt.plot(r*np.cos(t),r*np.sin(t), 'bo')
plt.show()
Run Code Online (Sandbox Code Playgroud)
但我很确定使用两个for循环有一个更有效的方法.
非常感谢