3d 如何将摄影机指向x、y位置的三维球体

3d 如何将摄影机指向x、y位置的三维球体,3d,geometry,webgl,3d,Geometry,Webgl,我正在尝试将webGL球体居中到特定的x,y点。我已经可以使用球坐标来定位地球仪(设置φ和θ),但我首先需要将x、y坐标转换为该系统(转换为φ和θ)。地球仪是一个球体,我可以轻松地将lat、long映射到地图上的某个位置(使用映射器函数) 因此,总的来说,我想要的是: convert lat/long to x/y position convert x/y to phi/theta <-- can't figure out how to do this position globe to

我正在尝试将webGL球体居中到特定的x,y点。我已经可以使用球坐标来定位地球仪(设置
φ
θ
),但我首先需要将x、y坐标转换为该系统(转换为
φ
θ
)。地球仪是一个球体,我可以轻松地将lat、long映射到地图上的某个位置(使用映射器函数)

因此,总的来说,我想要的是:

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
将横向/纵向转换为x/y位置

将x/y转换为φ/θ您需要定义球体中点的位置。我不是webGL或其他标准的专家,但我知道三维渲染是如何工作的

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

我更喜欢使用i,j,k和r,θ,φ。说实话,对于这些类型的应用程序,最重要的考虑因素是底层的数学表示,这意味着至少必须实现或链接到四元数类型,理想情况下,您还将包括一个库,用于处理线性代数文本中的矩阵变换和绑定之间的任何其他内容

如果您从底层数学的角度理解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得到φ,θ,你必须知道半径和中点到相机的距离,计算出π/2和π之间的天顶角和0到2pi之间的方位角。如果在球体周围建立一个正方形,并逐行进行(即光线跟踪器),则必须检查每个点是否位于半径r'的最后一个圆中,该圆的计算结果为r/(比例*z)z,即中点的z坐标

如果我们在圆中,我们将定义一个角度——方位角将是围绕圆中心的角度,天顶将是在所述x,y坐标下球体表面上的点与相机和通过球体中点的中点之间的表面点之间的角度。如果你使用我提到的角度运算,这就变成了一个简单的任务

我自己也在项目的这个阶段


一句话:您需要重新学习trig——这是一个绝对的要求,无论您使用的是什么API。

有帮助吗?谢谢,看看。虽然我不认为我能根据数学公式算出它。我也不知道如何才能得到他们所说的“圆柱坐标”。