![腾讯游戏开发精粹](https://wfqqreader-1252317822.image.myqcloud.com/cover/110/26262110/b_26262110.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.2 端点间二次样条的构建
在两个路点之间生成曲线,并且要求两个路点可以自由控制位置和朝向(切线方向)时,使用单一的一段二次曲线会遇到自由度不够的问题。这里构造了如下两条拼接的二次曲线来解决这个问题(见图3.1)。
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0053_0001.jpg?sign=1738963820-QEyF23VOvdjJUQyWYuY4M4x8qq5s7BU6-0-76514f55f0a6cdfb13b5e7ac5add4960)
图3.1 二次样条曲线示意图
给定起点P0、起点切线T0、终点P1和终点切线T1,有二次曲线f1(t)和f2(t),令其满足如下条件:
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0052_0001.jpg?sign=1738963820-3AjexQer4m0OdRnI5m4qtkNlU4j4NcHT-0-bfbf242ca22d986539e5352fc882a162)
对于f1(1)和f2(0),假设有一动点Pm,在该点处曲线满足:
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0053_0002.jpg?sign=1738963820-oieUNHqoL3bU5oHz8xdrcejRvM0CjEH1-0-02e919913a501e9cfa8067de3b7a35b7)
从而可以得到两条曲线的系数方程组:
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0053_0003.jpg?sign=1738963820-RSUrKUVPHRHLk29fvKThxsW7nAUjKwaX-0-051824f06e8f3713a731ecdfe93b1e6d)
该方程组的解为
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0053_0004.jpg?sign=1738963820-cG835tzRJiheYMojLA6M0q8Hw5frQmCm-0-02f814d8077e6e38c9c4b01b64ab50ed)
则有
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0053_0005.jpg?sign=1738963820-ve3BUZ5SxzFTu1dTbA4LKPQuVFCfHpyk-0-31e635a99f695f407df53657e6474019)
可以看到,最终动点Pm不会出现在方程中,它为隐含的点,对外部是透明的。为了将分段曲线当作一段曲线使用,还需要将两段子曲线的参数t归一化到统一的[0,1]范围内。令为参数t归一化后的分段二次曲线,有
,
。这里使用每段子曲线占拼接曲线的比例来归一化曲线参数。设L1、L2分别为曲线
和
的长度,则有
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0054_0006.jpg?sign=1738963820-NSwnehx1oTmY0VTaKcCVPM5S4BL78Fim-0-a0bcad1688bcea99e5682bab1a0a44be)
类似的,也可以得到曲线的长度方程,由子曲线长度方程
和
表示的归一化方程:
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0054_0010.jpg?sign=1738963820-TofaUvFd44dAS75RTMdcHIQslcRonauu-0-ab4b1ee794d2a242c695694403c339a2)
为此需要计算曲线f1(t)和f2(t)的曲线段和
的长度。对于二次曲线而言,曲线的线积分有解析解(分部积分):
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0054_0013.jpg?sign=1738963820-ej21yq5yQswt0vEt9zEnPneIvAwcZDPz-0-f88a3d7470c9dba125f9f8e8f601b056)
其中:
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0054_0014.jpg?sign=1738963820-YpXL0iUqYVCzVI7tZFlLU9uYEeMiWKIw-0-1a55879910bc06c4530e19ec90207d6a)
![](https://epubservercos.yuewen.com/EFD27D/14693592205506206/epubprivate/OEBPS/Images/figure_0055_0001.jpg?sign=1738963820-JNJddX0aOjPs0FgYjhJt8hVPHsOvIGsY-0-34854a6b4e11158e3e73e213dbf7d33d)
这些系数可以离线预计算好(静态路径),或者在运行时初始化曲线的时候计算(动态构建路径)。该公式较为复杂,但是多用于曲线归一化的预处理过程中。如果进一步完成了曲线的弧长参数化,将会使用更为简单的线性长度计算。