我正在尝试使用单个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!