游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1905|回复: 2

工作时做的贝塞尔曲线(Bezier curves)

[复制链接]

197

主题

1041

帖子

1104

积分

金牌会员

Rank: 6Rank: 6

积分
1104
QQ
发表于 2007-3-28 17:42:00 | 显示全部楼层 |阅读模式
  航迹的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,形象来表示一下。
  



17

主题

258

帖子

264

积分

中级会员

Rank: 3Rank: 3

积分
264
发表于 2007-3-29 08:54:00 | 显示全部楼层

Re:工作时做的贝塞尔曲线(Bezier curves)

不错

15

主题

363

帖子

390

积分

中级会员

Rank: 3Rank: 3

积分
390
发表于 2007-3-29 15:31:00 | 显示全部楼层

Re:工作时做的贝塞尔曲线(Bezier curves)

学习ing……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-4-13 00:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表