4

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

例如,给定一条形成字母“C”的曲线,第一个和最后一个控制点的表面法线都指向上方,色带应该从平面开始,与地面平行,然后慢慢转动,然后再次变平,面向与第一个控制点相同。要“顺利”完成此操作,它必须在曲线的中途面向外。目前(对于这种情况),我只能让所有表面朝上(而不是在中间向外),这会在中间产生难看的过渡。

这很难解释,我在这个例子的下面附上了一些图片,它现在看起来像什么(所有表面朝上,中间急剧翻转)和它应该是什么样子(平滑过渡,表面缓慢旋转)。银色面代表正面,黑色面代表背面。

不正确,它目前的样子:

正确功能区 http://img211.imageshack.us/img211/4659/ribbonincorrect.th.png

正确,它应该是什么样子:

功能区不正确 http://img515.imageshack.us/img515/2673/ribboncorrect.th.png

我真正需要的是能够为 3D 三次贝塞尔曲线上的任何点计算这个“混合法线向量”,我可以毫无问题地生成多边形,但我不知道如何让它们顺利旋转如图所示。完全不知道如何进行!

4

1 回答 1

2

您可以使用本答案第一部分中解释的算法,评估 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 是您喜欢的增量。

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

于 2010-12-26T23:26:30.147 回答