|
别去点击关闭窗口按钮!我现在就举个例子,由于我们现在暂时只讨论2-D游戏(3-D以后会循序渐进的谈到),就来个2-D线性方程组:
(1) 4.0*X1 + 2.0*X2 = 5.0
(2) 3.0*X1 + 3.0*X2 = 6.0
这里有两个方程,两个未知量,则根据上面的Cramer法则:
| 4.0 2.0 | d = | 3.0 3.0 | = 4.0*3.0 - 2.0*3.0 = 6.0 (2阶行列式的解法,'\'对角线相乘减去'/'对角线相乘)
| 5.0 2.0 | d1 = | 6.0 3.0 | = 5.0*3.0 - 2.0*6.0 = 3.0
| 4.0 5.0 | d2 = | 3.0 6.0 | = 4.0*6.0 - 5.0*3.0 = 9.0
则
X1 = d1/d = 3.0/6.0 = 0.5
X2 = d2/d = 9.0/6.0 = 1.5
好了,现在就得到了方程组的唯一一组解。
是不是已经掌握了用Cramer法则解2-D线性方程组了?如果是的话,我们继续。
三、深入研究
这里的2-D障碍碰撞检测的实质就是判断两条线段是否有交点,注意不是直线,是线段,两直线有交点不一定直线上的线段也有交点。现在我们从向量的角度,写出两条线段的方程。

现在有v1和v2两条线段,则根据向量加法:
v1e = v1b + s*v1
v2e = v2b + t*v2
v1b和v2b分别是两线段的一端。s,t是两个参数,它们的范围是[0.0,1.0],当s,t=0.0时,v1e=v1b,v2e=v2b;当s,t=1.0时,v1e和v2e分别是两线段的另一端。s,t取遍[0.0,1.0]则v1e和v2e取遍两线段的每一点。
那么我们要判断v1和v2有没有交点,就让v1e=v2e,看解出的s,t是不是在范围内就可以了:
v1e = v2e
=> v1b + s*v1 = v2b + t*v2
=> s*v1 - t*v2 = v2b - v1b
写成分量形式:
s*x_v1 - t*x_v2 = x_v2b - x_v1b
s*y_v1 - t*y_v2 = y_v2b - y_v1b
现在是两个方程式,两个未知数,则根据Cramer法则:
| x_v1 -x_v2 | | 4.0 -2.0 | d = | y_v1 -y_v2 | = | 1.0 -3.0 | = -10.0
| x_v2b-x_v1b -x_v2 | | 5.0 -2.0 | d1 = | y_v2b-y_v1b -y_v2 | = | 2.0 -3.0 | = -11.0
s = d1/d = -11.0/-10.0 = 1.1 > 1.0
现在s已经计算出来,没有在[0.0,1.0]内,所以两线段没有交点,从图上看很直观。t没有必要再计算了。所以是物体与障碍没有发生碰撞。如果计算出的s,t都在[0.0,1.0]内,则把它们带入原方程组,计算出v1e或者v2e,它的分量就是碰撞点的分量。
上一页 [1] [2] [3] 下一页
|