3D网格生成:沿着3D曲线拉伸2D形状时如何选择上轴?

时间:2018-08-11 07:32:23

标签: matrix vector 3d curve

我有一个2D形状(一个圆形),要沿着3D曲线拉伸以创建3D管网。

目前,我沿曲线生成横截面(形成所得网格的基础)的方式是获取沿曲线的每个控制点,为其创建3D变换矩阵,然后将圆的2D点相乘通过这些曲线点矩阵来确定它们在沿着曲线的3D空间中的位置。

要创建矩阵(由3个向量组成),我将曲线上的切线用作向上向量,将world-up([0,1,0])用作正向向量,并使用up /的叉积转发向量作为正确的向量。在创建最终矩阵的过程中,所有三个向量也被正交化。

问题出在我的曲线切线与世界坐标轴相同时。即,我的切向量为[0,1,0],世界上的物体为[0,1,0]。...由于两个平行向量的叉积不明确。...生成的拉伸网格具有沿着曲线的那些区域(捏,扭曲等)的伪影。

我认为一个潜在的解决方案是使用曲线切线和world-up的点积作为内插值,将正向矢量从world-up移到world-right ...换句话说,曲线切线逼近[0,1,0],我的前向矢量逼近[1,0,0] ...但是这也会导致沿最终网格的不必要的扭曲。

如何以一致的方式沿曲线拉伸形状,而不会发生翻转/伪影/扭曲?我知道这是有可能的,因为各种现成的3D应用程序都可以做到...我只是不确定如何。

1 个答案:

答案 0 :(得分:0)

我要采用的一种方法是将我在3D曲线上的切线矢量实际上是我感兴趣的平面的法线矢量。

比方说,切向量为u

现在您需要的是与其相对应的另外两个向量u,所以让我们开始吧。

让我们这样构造v:

u

(旋转坐标)。因为v是u与其他东西的叉积的结果,所以您知道v与u正交。

如果u具有相等的x,y,z坐标,则此方法将不起作用,在这种情况下,通过向至少两个变量rince&repeat 添加随机数来构造另一个向量)。

然后您可以像以前一样简单地构造w:

u

归一化并继续。