|
|
航迹的3D向量点与点的连接使用贝塞尔曲线算法。这套曲线算法大致是这样的。
如果已知一条曲线的参数方程,系数都已知,并且两个方程里都含有一个参数t,它的值介于0、1之间,表现形式如下所示:
x(t) = ax * t ^ 3 + bx * t ^ 2 + cx * t + x0
y(t) = ay * t ^ 3 + by * t ^ 2 + cy * t + y0
由于这条曲线的起点(x0,y0)是已知的,我们可以用以下的公式来求得剩余三个点的坐标:
x1 = x0 + cx / 3
x2 = x1 + ( cx + bx ) / 3
x3 = x0 + cx + bx + ax
y1 = y0 + cy / 3
y2 = y1 + ( cy + by ) / 3
y3 = y0 + cy + by + ay
你细细观察一下就知道了,无论方程的已知和所求是什么,总是有六个未知数,并且我们总能找到六个等式(记住(x0,y0)总是已知的),也就是说,上面的方法是完全可逆的,因此我们可以根据四个已知点坐标来反求曲线参数公式的系数。稍微一变换就得到了下面这组公式:
cx = 3 * ( x1 - x0 )
bx = 3 * ( x2 - x1 ) - cx
ax = x3 - x0 - cx - bx
cy = 3 * ( y1 - y0 )
by = 3 * ( y2 - y1 ) - cy
ay = y3 - y0 - cy - by
而做航迹的根据时间和速度来解算当前物体位于贝塞尔曲线中的位置,当然,因为飞机在转弯,倾斜的时候,飞行速度都会受到影响,等等,等等,可能有很多现在我还没有想到的地方。我推荐做法是,在解算完贝塞尔曲线以后,顺带一起解算那条航迹的长度,然后根据时间来解算飞机所处的航迹的具体位置这样就方便很多了。
因为做成3D的DEMO太花我时间了,我只做了一个2D的计算X+Y坐标的DEMO,然后画成Image,形象来表示一下。


|
|