【问题标题】:placing objects perpendicularly on the surface of a sphere that has a wavy surface将对象垂直放置在具有波浪形表面的球体表面上
【发布时间】:2020-08-21 14:09:53
【问题描述】:

所以我有一个球体。它围绕给定轴旋转并通过 sin * cos 函数改变其表面。 我在球体上的固定点也有一堆 tracticoids。这些物体在运动时跟随球体(包括旋转和表面的变化)。但我不知道如何使它们始终垂直于球体。我有 tracticoid 连接到球体表面及其法线向量的 ponts。牵引线最初以 z 轴为方向。所以我试图让它成为给定法线向量的轴,但我无法让它工作。

这是我计算 M 变换矩阵及其逆矩阵的地方:

virtual void SetModelingTransform(mat4& M, mat4& Minv, vec3 n) {
            M = ScaleMatrix(scale) * RotationMatrix(rotationAngle, rotationAxis) * TranslateMatrix(translation);
            Minv = TranslateMatrix(-translation) * RotationMatrix(-rotationAngle, rotationAxis) * ScaleMatrix(vec3(1 / scale.x, 1 / scale.y, 1 / scale.z));
    }

在我的绘图函数中,我设置了转换的值。 _M 和 _Minv 是球体的矩阵,因此 tracticoids 跟随球体,但是当我尝试使用旋转矩阵时,tracticoids 在球体表面上分层移动。 _n 是 tracticoid 应该遵循的法线向量。

void Draw(RenderState state, float t, mat4 _M, mat4 _Minv, vec3 _n) {
        SetModelingTransform(M, Minv, _n);
        if (!sphere) {
            state.M = M * _M * RotationMatrix(_n.z, _n);
            state.Minv = Minv * _Minv * RotationMatrix(-_n.z, _n);
        }
        else {
            state.M = M;
            state.Minv = Minv;
        }
        .
        .
        .
    }

【问题讨论】:

  • 对不起,我不明白球体的表面是如何变化的。它会沿着某个路径移动吗?也许只有到中心的距离改变了?那些“tracticoid”也是如此(我第一次看到这个概念),也许你最好在math.stackexchange.com
  • 一开始,球体的表面是“平的”。平坦我的意思是它是一个完美的球体。然后表面开始变得波浪状。我不知道如何更清楚地解释,基本上球体的 R 乘以 sin(3 * U + 4 * V) * cos(time) 所以它开始时球体产生更多的波,然后比回到原来的球体更小形式只是你重新开始。然后表面上有与球体完全垂直的牵引线,当球体改变其表面时,它们保持垂直。牵引线的形状保持不变,只是移动和旋转。
  • 也许只有我一个人,但到底什么是“tracticoid”在我的字典中看不到任何内容,在谷歌上我只看到“tractricoid”,即使没有任何有意义的描述......你也应该添加图片/你所拥有的和你想要的草图,因为它有点难以理解你的文字......甚至更多的代码......你正在为你的球体的每个顶点创建矩阵?你知道我们只能猜测你的表面的拓扑结构(它是如何存储的以及密度等属性是什么......)无论如何,垂直于表面是正常的......那么是什么阻止你计算它?跨度>

标签: opengl geometry


【解决方案1】:

你说你的球体有一个旋转轴,所以你应该有一个向量a 与这个轴对齐。

P = P(t) 成为您的对象所在的球体上的点。对于每个时刻t,您还应该在点P=P(t) 处有一个垂直于球体表面的向量n = n(t)。所有向量都被解释为列向量,即 3 x 1 矩阵。

然后,形成矩阵

U[][1] = cross(a, n(t)) / norm(cross(a, n(t)))
U[][3] = n(t) / norm(n(t))  
U[][2] = cross(U[][3], U[][1])

其中每个 j=1,2,3 U[][j] 是一个 3 x 1 向量列。那么

U(t) = [ U[][1], U[][2], U[][3] ]

是一个 3 x 3 正交矩阵(即它是围绕原点的 3D 旋转)

对于每个时刻t计算矩阵

M(t) = U(t) * U(0)^T

其中^T 是矩阵转置。

将您的对象从其原始位置旋转到其在时间t 的位置的最终转换应该是

X(t) = P(t) + M(t)*(X - P(0))

【讨论】:

    【解决方案2】:

    我不确定我是否得到了你的解释,但我开始了。

    你有一个带有波浪表面的球体。这意味着表面上的每个点都会改变其与球体中心的距离,就像海浪中的一块木头会在该位置改变其与海底的距离一样。
    我们可以看出,球体的辐射R 在每个点/时间情况下都是可变的。

    现在您有了 tracticoid(什么是 tracticoid?)。我会把它当作漂浮在波浪上的物体,并跟随球体的运动。

    那么您似乎在问如何使 tracticoid 跟随波浪表面和球体运动。

    嗯。如果我们用一个 4x4 矩阵来定义每个运动(“变换”),那么所有这些都可以简化为以正确的顺序组合这些矩阵。

    有一些很好的 OpenGL 教程可以教您变换以及如何组合它们。例如,请参阅learnopengl.com

    根据您的情况,可以使用多种转换。

    球体旋转。你需要一个旋转矩阵,我们称之为MSR(矩阵球体旋转)和一个旋转轴ASR。如果球体也平移,则还需要 MST
    表面波,带有一些函数f(lat, long, time),它为这些参数计算辐射的增量(有符号)。所以,Ri = R + f(la,lo,ti)

    对于 tracticoid,我猜你有一些定义 tracticoid 的三角形。我还猜想这些三角形是用“局部”坐标系表示的,其原点是 tracticoid 的中心。当您必须定位和旋转 tracticoid 时,您的问题就来了,对吧?

    你有两个选择。首先是旋转牵引线以使目标垂直于球体,然后将其平移以跟随球体旋转。虽然在数学上完全正确,但我觉得这个选项有些复杂。

    最好的选择是使 tracticoid 像球体一样旋转和平移,就好像两者共享同一个原点,即球体的中心。然后将其翻译到当前位置。

    第一部分很简单:定义这种变换的矩阵是M= MST * MSR,如果你使用典型的OpenGL轴约定,否则你需要交换它们的顺序。这个M 是所有对象(球体和 tracticoids)的公共部分。

    第二部分需要你有一个向量Vn,它定义了曲面中与球体中心相关的点。您应该能够使用上面f() 获得的参数纬度、经度和R 以及牵引线的大小/2(从其中心到它接触波浪的点的距离)来计算它。使用Vn的组件构建一个translation matrixMTT

    现在,只需将结果转换用于 tracticoid 的每个顶点:Mt = MTT * M = MTT * MST * MSR

    要渲染场景,您需要另外两个矩阵,用于相机 (MV) 和用于投影 (MP)。 Mt 用于每个 tracticoid,MVMP 用于所有对象,包括球体本身。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多