繁体   English   中英

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

[英]Replicating Blender bezier curves in a C++ program

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

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

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

在此输入图像描述

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

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

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

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

T0 = normalize(P1 - P0)

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

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

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

你现在有一套起始坐标( P0B0T0N0

在此输入图像描述

这是最初的相机方向。

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

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

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

N1 = crossproduct(B0, T1)

B1 = crossproduct(T1, N1)

在此输入图像描述

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

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

如果我理解你的问题,你想要的是为曲线的任何一点获得3个方向向量(左,前,上)。

这是一个简单的方法(有一个限制,(*)见下文):

1)前矢量:

计算给定位置(t)的贝塞尔曲线上的3d点。 这是我们计算前,左,上向量的点。 我们称之为current_point

计算曲线上的另一个3d点,在第一个点旁边(t + 0.01),让我们称之为next_point

注意:我不在这里写公式,因为我相信你已经知道如何做到这一点。

然后,要计算前向量,只需减去先前计算的两个点:

vector front = next_point - current_point

不要忘记将结果标准化。

2)左矢量

定义一个临时的“向上”向量

vector up = vector(0.0f, 1.0f, 0.0f);  

现在你可以使用正面和向上轻松计算:

vector left = CrossProduct(front, up);

3)向上矢量

vector up = CrossProduct(left, front);

使用此方法,您始终可以计算沿曲线的任何点的前,左,上。


(*)注意:这并不适用于所有情况。 想象一下,你在曲线上有一个循环,就像一个过山车循环。 在循环的顶部,您计算的向上矢量将是(0,1,0),而您可能希望它为(0,-1,0)。 解决这个问题的唯一方法是有两条曲线:一条用于点,另一条用于向上矢量(从左侧和前面可以轻松计算)。

首先,我们知道,您正在搜索的法向量位于与特定点上的曲线“局部垂直”的平面上。 所以真正的问题是在这个平面上选择一个矢量。

我制作了一个空物体来跟踪曲线,并注意到它的行为类似于过山车的推车:它的“向上”矢量与沿着曲线移动时的离心力相关。 可以从曲线的局部形状唯一地评估该曲率。

我不是很擅长物理,但我会尝试通过评估两个平面估计该向量:第一个是前面提到的垂直平面,第二个是由曲线段的三个相邻点组成的平面(如果曲线不是直,这些将形成一个三角形,它恰好描述了一个平面)。 这两个平面的交点将为您提供一个轴,您只需选择这样计算的法向量的方向。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM