如果给定起点和终点的法线,如何计算三维Bézier曲线上的点的法线?

时间:2010-12-26 23:16:07

标签: math geometry bezier polygons

我正在尝试使用单个3D立方Bézier曲线来渲染“3D色带”来描述它(色带的宽度是一些常数)。第一个和最后一个控制点有一个与它们相关的法向量(它们总是垂直于这些点处的切线,并描述这些点处色带的表面法线),我试图平滑地插入法向量。曲线的过程。

例如,给定形成字母“C”的曲线,第一个和最后一个控制点的表面法线都朝上,色带应平起,平行于地面,慢慢转动,然后再平放,面向与第一个控制点相同的方式。为了“顺利”地做到这一点,它必须在曲线的中途朝外。目前(对于这种情况),我只能使所有表面朝上(而不是向中间),这在中间产生了一个丑陋的过渡。

这很难解释,我已经在这个例子的下面附上了一些图像,它们看起来像是什么样的(所有表面朝上,中间是尖锐的翻转)以及它应该是什么样的(平滑过渡,表面缓慢旋转)回合)。银色的面孔代表正面,黑色面向背面。

不正确,目前的情况如下:

Correct Ribbon http://img211.imageshack.us/img211/4659/ribbonincorrect.th.png

正确,应该的样子:

Incorrect Ribbon http://img515.imageshack.us/img515/2673/ribboncorrect.th.png

我真正需要的是能够为3D立方贝塞尔曲线上的任何点计算这个“混合法线向量”,并且我可以生成多边形没有问题,但我无法弄清楚如何让它们到达如图所示顺利旋转。完全坚持如何继续!

1 个答案:

答案 0 :(得分:2)

你可以使用this answer第一部分中解释的算法,评估t = 0时的法线(或者你选择的固定t)会给你一个平滑的过渡。

像这样:

alt text

(想象一下你沿着蓝红色边框的人行道)

修改

好的,这是我用另一种方式得到的:

alt text

程序很简单:

拥有参数化功能:

f[t] := { x[t], y[t], z[t] }  

通过取导数来计算切向量:

f'[t] := { x'[t], y'[t], z'[t] }  

选择你的起始(和结束法线向量),例如:

n[0] = {0, 0, 1};

现在将另一个函数定义为导数和法线的矢量积:

cp[t_] := CrossProduct[f'[t], n[0]];  

就是这样。

我的四边形的要点在于:

 {f[t] - cp[t]/3, 
  f[t] + cp[t]/3, 
  f[t + dt] + cp[t + dt]/3, 
  f[t + dt] - cp[t + dt]/3}  

其中dt是你喜欢的增量。

更复杂的方法可能会考虑曲线路径长度,但我猜这是算法的第二次迭代。

HTH!