math – 如果给出其起点和终点的法线,如何计算3D立方贝塞尔曲线上的点的法线?

我正在尝试使用单个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立方贝塞尔曲线上的任何点计算这个“混合法向量”,并且我可以生成多边形没有问题,但我无法弄清楚如何让它们顺利地旋转如图所示.完全坚持如何继续!

最佳答案 您可以使用
this answer第一部分中解释的算法,评估t = 0处的法线(或固定的t,无论您选择哪个)将为您提供平滑过渡.

像这样:

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

编辑

好的,这是我通过另一种方式获得的:

程序很简单:

有你的参数化功能:

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!

点赞