【问题标题】:How to calculate the normal of points on a 3D cubic Bézier curve given normals for its start and end points?给定起点和终点的法线,如何计算 3D 三次贝塞尔曲线上点的法线?
【发布时间】:2011-05-30 23:10:34
【问题描述】:

我正在尝试使用单个 3D 三次贝塞尔曲线来渲染“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 三次贝塞尔曲线上的任何点计算这个“混合法线向量”,我可以毫无问题地生成多边形,但我不知道如何让它们如图所示顺利旋转。完全不知道如何进行!

【问题讨论】:

标签: math geometry bezier polygons


【解决方案1】:

您可以使用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!

【讨论】:

  • 该图像似乎描绘了我所追求的,但我无法理解所使用的方程式。具体来说,我主要只熟悉类 C 语言……我想你不能再解释一下这些方程式吗?
  • @Robert 没问题,但我不想写书。这些是数学函数。如果您让我知道您的问题出在哪里,我会尽力提供帮助!
  • 好的,我有点了解你的数学函数——我对你的圆方程感到困惑。那么我是否正确地认为提到的正交平面或多或少是我需要计算的?该平面的表面法线(在某个位置 t)是否与我要计算的向量相同?我手头有我的 Bézier 的参数方程,并计算了它们的导数以找到切线,所以也许明天当我不累时,我将尝试将它们付诸实践。同时,感谢您的帮助!
  • @Robert 你写的都是对的。看来你在你的道路上是对的。请注意,这些圆圈实际上为您提供了两个方程(带有 +/- Sqrt[]),蓝/红线位于这些解决方案之间,您最好将其作为参数化,这样您就可以通过路径固定角度。
  • @belisarius 感谢到目前为止的所有帮助,但我仍然感到困惑......我一直在研究方程式,但我如何计算圆方程? (使用一些绘图软件,除了恰好被平面二等分的球体之外,我什么也得不到。)在我得到圆的方程之后,我该如何计算我所追求的法线?
猜你喜欢
  • 2016-06-24
  • 2011-08-03
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多