【问题标题】:How to point camera to 3d sphere at x,y position如何将相机指向x,y位置的3d球体
【发布时间】:2014-01-29 17:08:08
【问题描述】:

我正在尝试将 webGL 球体居中到特定的 x,y 点。我已经可以使用球坐标定位地球(设置phitheta),但我首先需要将x、y 坐标转换到这个系统(到phitheta)。地球是this image 的球体,我可以轻松地将经纬度映射到自己在该地图上的某个位置(使用映射器函数)。

所以总的来说我想要的是:

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

这里有一个例子来说明我的意思:

http://mikevanrossum.nl/stuff/globe/

使用白框中的控件,您可以增加phitheta,然后您会看到它旋转。我无法想出将这些数字映射到图像上的位置的方法。有人知道我该怎么做吗?

【问题讨论】:

标签: 3d geometry webgl


【解决方案1】:

您需要定义球体的中点落在哪里。我不是 webGL 或其他标准方面的专家,但我知道 3D 渲染是如何工作的。

据我所知,您有一个由半径、天顶角和方位角的顶点定义的球体。这是定义球体的一种足够体面的方式。快速查看维基百科将为您提供球坐标的深入解释。基本上按照定义,天顶角给出了点、原点和 z 轴之间的角度,方位角表示围绕 z 轴的角度。

我的偏好是使用 i、j、k 和 r、theta、phi。说实话,这些类型的应用程序最重要的考虑因素是底层数学表示,这意味着您至少必须实现或链接到四元数类型,理想情况下,您还应该包括一个处理矩阵变换和任何东西的库else 之间的绑定在线性代数文本中。

如果您从底层数学的角度理解 API 的作用,那么这将是一个非常简单的操作。首先,我们有一个地球的中点——在你的例子中,它看起来像 0、0、z(或 k)。一般来说,如果我们使用简化的点转换模型,可以发现当相机在 0、0、0 处朝向正 z(或 k)时,正如之前多次提到的,你最终将x(或 i)和 y(或 j)由 z(或 k)。 (即 x'=x/z;y'=y/z)

世界坐标中的球体半径将对应于 a 值 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、theta,您必须知道中点到相机的半径和距离,即 pi/2 和 pi 之间的天顶角和 0 和 2pi 之间的方位角。如果您在球体周围建立一个正方形,并逐行进行(即光线跟踪器),您必须检查每个点是否在半径 r' 的最终圆中,这将是 r/(scale * z) z是中点的z坐标。

如果我们在圆中,我们将定义一个角度 - 方位角将是围绕圆心的角度,而天顶将是球体表面上在所述 x 处的点之间的角度, y 坐标和相机与通过球体中点的中点之间的表面点。如果您使用我提到的角度操作,这将成为一项简单的任务。

我自己也处于项目的这个阶段。

底线:你需要重温你的三角 - 这是一个绝对的要求,无论你使用什么 API。

【讨论】:

    猜你喜欢
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多