在C++程序中复制Blender bezier曲线

Ale*_*x Z 4 c++ math bezier blender

我正在尝试从Blender导出(3D)贝塞尔曲线到我的C++程序.我前一段时间问了一个相关的问题,我成功地指示使用De Casteljau的算法沿贝塞尔曲线评估点(和这些点的切线).这很好用.事实上,完美.我可以使用De Casteljau的算法导出曲线并沿着曲线评估点以及这些点的切线.

然而,在3D空间中,沿着贝塞尔曲线的点和该点的切线不足以定义相机可以锁定的"框架",如果这是有意义的话.换句话说,没有"向上矢量",这是在沿曲线的任何点正确指定摄像机方向所需的.从数学上讲,沿着3D贝塞尔曲线的任何点都有无限量的法向量.

我注意到在Blender中构建曲线时,它们不仅仅是无限细线,它们实际上看起来在它们的任何一点都有一个正确的3D方向(如下面截图中的"箭头线"一样).我想在我的程序中尽可能地复制blender所做的事情.也就是说,我希望能够形成一个矩阵,表示沿着3D贝塞尔曲线的任意点的方向(几乎与Blender本身一样).

在此输入图像描述

任何人都可以在这里提供进一步的指导,也许是对Blender源代码有深入了解的人吗?(但是欢迎任何建议,Blender背景与否.)我知道它是开源的,但由于程序的广泛性,我在分离负责这些曲线计算的代码时遇到了很多麻烦.

tig*_*rou 6

几周前,我找到了解决这个问题的方法.我在这里发布,以防其他人需要它:

1)对于给定点P0,计算切向量T0.

一种简单易行的方法是在曲线上取下一个点,减去当前点,然后归一化结果:

T0 = normalize(P1 - P0)

获得切线的另一种更精确的方法是计算贝塞尔曲线函数的导数.

然后,选择一个任意向量V(例如,你可以使用(0, 0, 1))

制作N0 = crossproduct(T0, V)B0 = crossproduct(T0, N0)(不要忘记在每次操作后对结果向量进行标准化)

您现在有一个启动组坐标(P0,B0,T0,N0)

在此输入图像描述

这是最初的相机方向.

2)然后,计算下一个点及其方向:

T1使用与之相同的方法计算T0

这是技巧,新参考帧是从前一帧计算的:

N1 = crossproduct(B0, T1)

B1 = crossproduct(T1, N1)

在此输入图像描述

对其他点使用相同的方法.根据曲线如何改变其方向,使相机稍微绕切线矢量旋转.循环将被正确处理(相机不会像我之前的答案那样扭曲)

你可以在这里观看一个实例(不是我):http://jabtunes.com/labs/3d/webgl_geometry_extrude_splines.html