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