gpt4 book ai didi

math - 给定起点和终点的法线,如何计算 3D 三次贝塞尔曲线上点的法线?

转载 作者:行者123 更新时间:2023-12-05 00:52:47 24 4
gpt4 key购买 nike

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

最佳答案

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

像这样:

alt text

(想象你的人行道沿蓝红边界)

编辑

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

alt text

程序很简单:

有你的参数化功能:

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 是您喜欢的增量。

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

哼!

关于math - 给定起点和终点的法线,如何计算 3D 三次贝塞尔曲线上点的法线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4535809/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com