我有一个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应用程序都可以做到...我只是不确定如何。
答案 0 :(得分:0)
我要采用的一种方法是将我在3D曲线上的切线矢量实际上是我感兴趣的平面的法线矢量。
比方说,切向量为
现在您需要的是与其相对应的另外两个向量,所以让我们开始吧。
让我们这样构造v:
(旋转坐标)。因为v是u与其他东西的叉积的结果,所以您知道v与u正交。
(如果u具有相等的x,y,z坐标,则此方法将不起作用,在这种情况下,通过向至少两个变量rince&repeat 添加随机数来构造另一个向量)。
然后您可以像以前一样简单地构造w:
归一化并继续。