我正在尝试将webGL球体置于特定的x,y点。我已经可以使用球面坐标定位球体(设置phi
和theta
),但我首先需要将x,y坐标转换为此系统(phi
和{{ 1}})。地球是this image的球体,我可以轻松地将纬度,长度映射到该地图上的位置(使用映射器函数)。
所以总的来说我想要的是:
theta
这是一个看我的意思的例子:
http://mikevanrossum.nl/stuff/globe/
使用白框中的控件可以增加convert lat/long to x/y position
convert x/y to phi/theta <-- can't figure out how to do this
position globe to the new phi/theta
和phi
并看到它旋转。我无法想出将这些数字映射到图像上的位置的方法。有人知道我怎么做吗?
答案 0 :(得分:1)
您需要定义球体中点的位置。我不是webGL或其他标准的专家,但我知道三维渲染是如何工作的。
据我所知,你有一个由半径顶点,天顶角和方位角定义的球体。这是定义球体的一种不错的方式。快速检查维基百科将为您提供球面坐标的深入解释。基本上如定义,天顶角为您提供点,原点和z轴之间的角度,方位角将指示围绕z轴的角度。
我的偏好是使用i,j,k和r,theta,phi。说实话,对于这些类型的应用程序,最重要的考虑因素是基础数学表示,这意味着至少你必须实现或链接到四元数类型,理想情况下,你还需要包含一个处理矩阵变换和任何东西的库。否则在线性代数文本中的绑定之间。
如果您从基础数学的角度理解API正在做什么,那么这是一个非常简单的操作。首先,我们有一个地球的中点 - 在你的情况下,它将看起来像0,0,z(或k)。一般来说,如果我们使用简化的点转换模型,可以发现,当摄像机在0,0,0面向正z(或k)时,正如之前多次提到的那样,你最终会将两者都分开x(或i)和y(或j)由z(或k)表示。 (即x'= x / z; y'= y / z)
世界坐标中球体的半径将对应于值r'= r / z,因为对于大多数显示器,像素是正交排列的,并且将是球体的可见半径。如果您将地球移出z轴,则必须调整视野,因为如果世界坐标中的半径相对较大,则球体将变为椭圆形。
纠正此问题的最佳方法是将其缩小一定比例,然后按相同比例放大。那么半径仍然看起来是r,但是在我们生成球体之前,我们已经将它除以世界坐标中的某个比例。然后,一旦在世界坐标中生成半径为r / scale的球体,我们必须乘以x'和y'中的那个比例,使得x'= scale * x / z和y'= scale * y / z。我假设你知道如何将图像置于框架中心。
如果不缩小球体的半径大约两位有效数字并放大相似的数量,则球体将在观察窗口的边缘处显示为拉伸和椭圆形。如果你仍然需要x坐标和yz平面以及y坐标和xz平面之间的角度,那就像atan2或arctan2(x,z)和(y,z),其中有两个参数功能,以避免除以零。您仍然不希望渲染z值为零的任何内容。
确定三维空间中角度的另一种方法是取A和B的xyz坐标,计算它们之间的点积并除以规范的乘积;这将通过原点给出A和B之间角度的余弦。我在我的函数中省略了arccos操作,因为它也用于Phong着色。
要从x,y得到phi,θ,你必须知道半径和相机中点的距离,它与pi / 2和pi之间的天顶角以及0到2pi之间的方位角有关。如果你围绕球体建立一个正方形,并逐行(即光线跟踪器),你必须检查每个点是否在半径为r'的最后一个圆圈中,这将是r /(scale * z)z是中点的z坐标。
如果我们在圆圈中,我们将定义一个角度 - 方位角将是围绕圆心的角度,天顶将是所述x处球体表面上的点之间的角度, y坐标和相机与中点之间的表面点通过球体的中点。如果你使用我提到的角度操作,这将成为一项简单的任务。
我自己正处于这个项目阶段。
结论:你需要了解你的触发 - 这是一个绝对的要求,无论你使用什么API。