我只是无法弄清楚如何使一个具有给定速度的点在我的可视化中在笛卡尔空间中移动,同时保持在一个球体(行星)周围。
输入:
许多要点:
- XYZ 中的 Vector3 位置(使用下面的球面函数转换的纬度/经度坐标)。
- Vector3 速度(例如,向东 1.0 m/s,向北变化 0.0 m/s,向北变化 2.0 m/s)。请注意,这些不是度数,只是米/秒,类似于我的世界空间单位。
只需将速度添加到点位置将使点在球体上飞行,这是有道理的。因此,需要转换速度,以便保持在球体周围。
目标:目标是围绕球体创建一些流线,例如:
全球矢量的示例图像
所以,我一直在尝试改变基本思想:以法线到我的球体中心,得到一个垂直向量并再次乘以得到一个切线:
// Sphere is always at (0,0,0); but just to indicate for completeness:
float3 normal = objectposition - float3(0,0,0);
// Get perpendicular vector of our velocity.
float3 tangent = cross(normal,velocity);
// Calculate final vector by multiplying this with our original normal
float3 newVector = cross(normal, tangent);
// And then multiplying this with length (magnitude) of the velocity such that the speed is part of the velocity again.
float final_velocity = normalize(newVector) * length(velocity);
然而,这只适用于数据的一部分,看起来它只适用于西半球的一半(比如美国)。为了让它(部分)在东南部地区(比如南非)工作,我不得不切换 U 和 V 组件。
球体的 XYZ 坐标是使用球坐标创建的:
x = radius * Math.Cos(lat) * Math.Cos(lon);
y = radius * Math.Sin(lat);
z = radius * Math.Cos(lat) * Math.Sin(lon);
当然,我也尝试了各种变体,将不同的“上/右”向量相乘,例如 float3(0,1,0) 或 float3(0,0,1),切换 U/V/W 分量等将速度转换为运行良好的东西。但是在大约 30 小时没有任何进展之后,我希望有人可以帮助我并为我指明正确的方向。问题基本上是只有球体的一部分是正确的。
考虑到一部分数据可视化还不错,我觉得应该可以通过交叉点积来实现。由于性能在这里非常重要,因此我试图远离“昂贵的”三角运算 -如果可能的话。
我尝试过切换速度分量,在所有情况下,一个区域/半球都可以正常工作,而其他区域/半球则不行。例如,切换 U 和 V(暂时忽略 W)使非洲和美国都能正常工作。但从美国中途开始,事情又出问题了。
为了更好地说明这个问题,用几张图片。大紫色图像是使用 QGIS3 生成的,并显示了它应该是怎样的:
不幸的是,我有一个新的 SO 帐户,还不能发布图片。因此,一个链接,对不起。
真的希望有人能对这个问题有所了解。我需要一个旋转矩阵来旋转速度矢量吗?或者乘以(正确的)法线/切线就足够了?在我看来,除了这些奇怪的怪事之外,我觉得我忽略了一些微不足道的事情。
然而,数学真的不是我的事,破译公式对我来说是一个很大的挑战。所以请耐心等待并尽量保持语言相对简单(向量函数名称对我来说比科学数学符号容易得多)。能走到这一步,对我自己来说已经是一个了不起的成就。
我试图尽可能清楚,但如果事情不清楚,我很乐意更详细地阐述它们。