matrix - 3D 网格生成:沿 3D 曲线拉伸 2D 形状时如何选择上轴?
问题描述
我有一个 2D 形状(圆形),我想沿着 3D 曲线拉伸以创建 3D 管状网格。
目前我沿曲线生成横截面(形成最终网格的基础)的方式是沿曲线获取每个控制点,为其创建一个 3D 变换矩阵,然后将我的圆的 2D 点乘以这些曲线点矩阵来确定它们在 3D 空间中沿曲线的位置。
为了创建矩阵(从 3 个向量),我使用曲线上的切线作为上向量,世界上 ([0,1,0]) 作为前向向量,上/前向量的叉积为正确的向量。在创建最终矩阵的过程中,所有三个向量也被正交化。
当我的曲线切线与世界向上轴相同时,问题就出现了。即,我的切线向量是 [0,1,0] 并且世界上是 [0,1,0]....因为两个平行向量的叉积不明确....生成的拉伸网格有沿着曲线的这些区域的伪影(挤压、扭曲等)。
我认为一个潜在的解决方案是使用曲线切线和世界向上的点积作为插值,将我的前向矢量从世界向上移动到世界右侧……换句话说,当曲线切线接近时[0,1,0],我的前向向量接近 [1,0,0]...但这也会导致最终网格上出现不必要的扭曲。
如何以没有翻转/伪影/扭曲的一致方式沿曲线挤压我的形状?我知道这是可能的,因为各种现成的 3D 应用程序都可以做到这一点......我只是不确定如何。
解决方案
我解决这个问题的一种方法是将我的 3D 曲线的切线向量视为实际上是我感兴趣的平面的法线向量。
比方说,切向量是
你现在需要的只是另外两个与它正交的向量,所以让我们来吧。
让我们像这样构造 v:
(旋转坐标)。因为 v 是 u 和其他东西的叉积的结果,所以你知道 v 与 u 正交。
(如果您的 x,y,z 坐标相等,则此方法将不起作用,在这种情况下,通过将随机数添加到至少两个变量 rince&repeat 来构造另一个向量)。
然后你可以像以前一样简单地构造 w :
正常化然后去。
推荐阅读
- bamboo - 为 Atlassian Bamboo 中的跑步设置“标志”
- python - 匹配内容创建新列
- http - 非 OPTIONS 响应中的“Access-Control-Allow-Origin: *”是一个漏洞吗?
- rest - 是否可以使用 splunk dbxquery 运行 curl 命令?
- python - 重复使用对齐的图像进行边缘检测和阈值处理
- amazon-web-services - 放大配置
- javascript - 如何从第二个下拉值中从数据库中获取数据
- javascript - KendoUI - 选择时禁用某些节点
- binding - 如何在 SwiftUI(或替代方法)的主体方法中初始化派生变量
- sql - 如何创建一个将记录从一个表插入到另一个表并检查有效性的过程?PL/SQL