gpt4 book ai didi

c++ - 在 C++ 程序中复制 Blender 贝塞尔曲线

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:45 24 4
gpt4 key购买 nike

我正在尝试将 (3D) 贝塞尔曲线从 Blender 导出到我的 C++ 程序。 I asked a related question a while back ,在那里我成功地被引导使用 De Casteljau 的算法沿着贝塞尔曲线评估点(以及这些点的切线)。这很好用。事实上,完美。我可以使用 De Casteljau 的算法导出曲线并计算沿曲线的点以及这些点的切线,所有这些都在我的程序中。

但是,在 3D 空间中,沿着贝塞尔曲线的一个点和该点的切线不足以定义相机可以锁定的“框架”,如果这有意义的话。换句话说,没有“向上 vector ”是在沿曲线的任何点正确指定相机方向所必需的。从数学上讲,沿着 3D 贝塞尔曲线的任意点都有无限多的法 vector 。

我在 Blender 中构建曲线时注意到,它们不仅仅是无限细的线,它们实际上似乎在沿着它们的任何点定义了正确的 3D 方向(如分支所示下面屏幕截图中的“箭头线”)。 我想在我的程序中尽可能接近地复制 blender 在这里所做的事情。也就是说,我希望能够形成一个矩阵来表示沿 3D 贝塞尔曲线的任意点的方向(几乎与 Blender 本身完全一样)。

enter image description here

谁能在这里提供进一步的指导,也许是对 Blender 源代码有深入了解的人? (但是欢迎任何建议,无论是否有 Blender 背景。)我知道它是开源的,但由于程序庞大,我在隔离负责这些曲线计算的代码时遇到了很多麻烦.

最佳答案

几周前,我找到了这个问题的解决方案。我把它贴在这里,以防其他人需要它:

1) 对于给定的点P0,计算切 vector T0

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

T0 = 归一化(P1 - P0)

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

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

使 N0 = crossproduct(T0, V)B0 = crossproduct(T0, N0)(不要忘记在每次操作后归一化结果 vector )

您现在有了一组起始坐标(P0B0T0N0)

enter image description here

这是初始相机方向。

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

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

这是诀窍,新的引用帧是根据前一帧计算的:

N1 = 叉积(B0, T1)

B1 = 叉积(T1, N1)

enter image description here

对其他点使用相同的方法继续。根据曲线如何改变其方向,相机会围绕切线 vector 轻微旋转。循环将被正确处理(相机不会像我之前的回答那样扭曲)

您可以在这里观看现场示例(不是我的):http://jabtunes.com/labs/3d/webgl_geometry_extrude_splines.html

关于c++ - 在 C++ 程序中复制 Blender 贝塞尔曲线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9963551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com