【问题标题】:Avoid twisting artifacts in spline extrusion?避免样条拉伸中的扭曲伪影?
【发布时间】:2016-04-02 16:47:27
【问题描述】:

我正在尝试将 2d 形状轮廓附加到样条曲线。在样条曲线的某些点上,我的几何图形中出现了奇怪的扭曲伪影,如图所示。如何使用 Frenet-Frame 方程避免这种情况?

我目前对法线、副法线和切线的计算:

forward_tangent_vector = glm::normalize(pointforward - pointmid);
backward_tangent_vector = glm::normalize(pointmid - pointback);
second_order_tangent = glm::normalize(forward_tangent_vector - backward_tangent_vector);
binormal = glm::normalize(glm::cross(forward_tangent_vector,second_order_tangent));
normal = glm::normalize(glm::cross(binormal, forward_tangent_vector));

//translation matrix
T = glm::translate(T, pointmid);

normal_axis = glm::vec3(0, 1, 0);
rotationAxis = glm::cross(normal_axis, forward_tangent_vector);
rotationAngle = glm::acos(glm::dot(normal_axis, forward_tangent_vector));

//rotation matrix
R = glm::rotate(R, glm::degrees(rotationAngle), rotationAxis);

【问题讨论】:

    标签: c++ opengl curve spline glm-math


    【解决方案1】:

    你成了hairy ball theorem的受害者:

    计算机图形学中的一个常见问题是在 R3 中生成一个与给定非零向量正交的非零向量。没有单个连续函数可以对所有非零向量输入执行此操作。这是毛球定理的推论。要看到这一点,请将给定向量视为球体的半径,并注意找到与给定向量正交的非零向量等价于找到与该球体表面相切的非零向量。半径。然而,毛球定理表明,不存在可以对球体上的每个点(即每个给定向量)执行此操作的连续函数。

    另见:http://blog.sigfpe.com/2006/10/oriented-fish-and-hairy-balls.html

    问题出在这两行:

    normal_axis = glm::vec3(0, 1, 0);
    rotationAxis = glm::cross(normal_axis, forward_tangent_vector);
    

    forward_tangent_vector(0,1,0) 共线时,rotationAxis 变为(0,0,0)。这就是为什么你的管道会震动。

    您需要做的不是硬编码(0,1,0),而是取样条的一阶导数(速度/切向量),取样条的二阶导数(加速度/法线向量),然后取它们的叉积(双常态)。对这三个向量进行归一化,你会得到所谓的Frenet-frame,即围绕样条的一组 3 个相互垂直的向量。

    请注意,您的样条曲线必须是 C2 连续的,否则您会得到由二阶导数(也称为加速度/法线向量)中的不连续性引起的类似“扭曲”。

    一旦您有了 Frenet 框架,只需简单地更改基础即可在该坐标系中工作。不要乱用glm::rotate,只需将 x,y,z 单位向量作为行(或列)放入矩阵中?我不确定 GLM 使用什么约定......)这将是你的转换矩阵.

    【讨论】:

    • 那么问题是我无法确定曲线是否是 C2 连续的。该曲线由可能提供也可能不提供 C2 连续曲线的算法生成。一旦我有了tbn 矩阵,我该如何更改这些圆形轮廓(2d 形状)的基础。
    • 只需将顶点与此矩阵相乘即可​​。也不要忘记将原点转换为 Frenet 框架的原点。
    • 使用 Fernet 框架并不能帮助您完全解决此类问题,因为非凸曲线上的 Frenet 框架会反转法线场的方向。您将需要使用旋转最小化框架来避免该问题。本文解释它faculty.engineering.ucdavis.edu/farouki/wp-content/uploads/…
    猜你喜欢
    • 2015-02-15
    • 2011-09-06
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2010-10-14
    • 1970-01-01
    • 2020-02-15
    相关资源
    最近更新 更多