【问题标题】:Properly orienting a 3D mesh to point in the direction it's heading正确定位 3D 网格以指向其前进方向
【发布时间】:2024-01-17 21:19:01
【问题描述】:

我正在尝试让网格穿过球体上的电路。我拍摄了包裹在球体周围的图像,并为我希望网格遵循的路径着色。然后我计算了路径的所有 (u, v) 点。使用 (u, v) 点,我将转换为球坐标以将网格放到球体上,并设置围绕 X 和 Y 轴 rot.xrot.y 的旋转,以便网格与球体相切并且面向球体的北极。我的问题是让网格面向它前进的方向。第三个旋转变量rot.z 用于设置网格的方向。目前,我得到了从第 5 到第 14 个点的 (u, v) 点,并取当前点和未来 10 个点中每个点的线段仰角的平均值。这可行,但两个缺点是航向振动非常频繁,并且航向在稍微急转弯时倾向于不准确。计算网格航向的好方法是什么?

【问题讨论】:

    标签: opengl 3d rotation


    【解决方案1】:

    一个简单的方法是建立一个旋转矩阵。这样您就不必考虑角度,因为如果您知道方向以及向上或向右矢量,则可以计算所有条目。在您的情况下,方向是球体上的切线,向上向量是该点的法线。

    vec3 direction = tangent;
    vec3 up = normal;
    vec3 right = cross(direction,up);
    
    mat3 m;
    m[0] = right;
    m[1] = up;
    m[2] = direction;
    

    【讨论】:

    • 这就是问题所在:在你的方法中计算方向向量,或者在我的方法中设置一个旋转角度。因为我正在处理一个球体,所以我会看一个切平面,而不是一条线。网格是定向的,因此我使用 rot.xrot.y 来确保网格位于切平面上(因此我可以计算 up 向量),但我试图根据网格将要到达的点。
    • 那有什么问题呢?切平面上有无限个可能的向量。找到一个应该不难;)。
    • 基本上,我有一个包含大约 5000 个 (u, v) 点的列表,这些点构成了经过的路径。给定路径的索引i,我查看点i+5i+14 并求和arctan2(v2-v1, u2-u1)。它可以工作,但它会导致网格的角度跳跃很多,我​​正在尝试找到一种方法来使角度变化更平滑
    • 所以你想在球体上从p1p2?一个方向向量可以很容易地用 2 个叉积计算出来。 d = p2-p1; up=normalize(p1-middle); right = cross(d,up); direction=cross(up,right);
    • 我假设middle 是球体的中心?