将对象垂直放置在具有波浪形表面的球体的表面上



所以我有一个球体。它围绕一个给定的轴旋转,并通过sin*cos函数改变其表面。在球体上的固定点上,我也有一堆束面。这些对象在移动时跟随球体(包括曲面的旋转和更改)。但我不知道如何使它们始终垂直于球体。我有一个点,在这里牵引线连接到球体的表面和它的法向量。牵引面最初由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));
}

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

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;
}
.
.
.
}

你说过你的球体有一个旋转轴,所以你应该有一个向量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])

其中对于每个CCD_ 6,CCD_。然后

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

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

对于每个时刻t,计算矩阵

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

其中CCD_ 9是矩阵换位。

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

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

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

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

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

然后,你似乎在问如何使牵引曲面同时遵循波浪曲面和球体的运动。

嗯。如果我们用一个4x4矩阵来定义每个移动("变换"),那么它都可以简化为以适当的顺序组合这些矩阵。

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

对于您的情况,有几个转换可供使用。

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

对于牵引线,我想你有一些三角形定义了一个牵引线。我还猜测这些三角形是在"局部"坐标系中表示的,其原点是牵引线的中心。当你必须定位和旋转牵引索时,你的问题就来了,对吧?

你有两个选择。第一种方法是旋转tracticoid,使if瞄准垂直于球体,然后平移它以跟随球体旋转。虽然数学上完全正确,但我觉得这个选项有些复杂。

最好的选择是使tracticoid与球体完全一样旋转和平移,就好像两者共享相同的原点,即球体的中心。然后将其转换为当前位置。

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

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

现在,只需得到结果变换,即可用于轨迹的每个顶点:Mt = MTT * M = MTT * MST * MSR

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

最新更新