我正在为游戏寻找简单的停车算法。
汽车和车库的位置分别由3个数字(x, y, theta)
定义。其中x
和y
-对象的中心,theta
-对象轴和X轴之间的角度。
简化了汽车运动-它是一个点(无需计算确切的轮胎运动),可以fixed speed
来回行驶或沿半径为{{ 1}}(转弯半径可以是固定的或灵活的-没关系-任何选择对我来说都可以),并且它具有R
。
车库有3堵墙,不应被汽车碰触。可以使用精确的尺寸进行碰撞,但为简单起见,可以通过测量轿厢与车库之间的角度以及轿厢轴线与车库中心之间的距离来检查碰撞。当汽车和车库足够靠近时(中心之间的距离小于某个常数no inertia or acceleration
),碰撞将由CloseEnough
用滴答声模拟的世界,我们采用当前的汽车控制-(alpha, d) < (maxAlpha, maxDistance)
向前或向后以及moving direction
,然后计算汽车的下一个位置。
算法应产生一系列控制命令,例如turning angle
。
是否可以迭代,一次生成一个命令,然后检查下一个滴答发生了什么并产生另一个。 它可以要求模拟引擎根据控制命令模拟并生成新坐标,或者使用模拟引擎尝试多个选项并选择最佳选项。
也可以通过一系列近似的运动来做到这一点,就像它尝试过一次-错过了,又尝试了一次-靠近,第三次-最终停下来了(但应该更多或更多)不太合理,不要做数十或数百次来回迭代。
答案 0 :(得分:1)
有一些问题需要解决,例如成功停靠需要多少精度,以及“刻度”允许的精度是多少。您必须进行试验。但这是一种通用方法:
在不失去一般性的前提下,假设汽车沿直线和最小半径的圆弧运动。 (较大的圆圈将使行程更短,更平缓,但请稍后再使用。)实际上,这意味着交替使用线-线-线-线-线...
最终目的是直接驶入车库。
在此之前的目标(“倒数第二个”)是进入与该路径相切的一个圆,并尽可能靠近车库。因此,如果车库位于(0,0,0),则圆的中心位于(0,+ / 1r)。通常,如果车库位于(x,y,θ),则圆的中心位于(x-/ +rsinθ,y +/-rcosθ)。
在此之前的目标(“倒数第二个?”)是使汽车已经在一个圆上(左硬或右硬)到达与该圆和目标圆均切线的直线上。
如果需要的话,之前的目标是绕过车库,以便汽车能够执行已经描述的动作而不会撞到它。解决该问题的一种方法是绘制一个以车库每个角为中心的圆,并从一个圆到另一个圆。
够了吗?