如何将 2D 水平 (Oxy) 平面上的点渲染为 2D 垂直 (phone) 平面上的点?

How to render points on a 2D horizontal (Oxy) plane into points on a 2D vertical (phone) plane?

我正在尝试将 (longitude/latitude) 个位置转换为 phone 屏幕上的矩形。但现在让我们假设它们是 Oxy 平面上的正常点。

假设相机站在 (X,Y) 点,对应于 phone 屏幕的中心。它指向 (vx,vy) 方向,它有 60 度视锥(顺时针 30 度,逆时针 30 度)。相机方向可以自由旋转,所以vx, vy in [-1 -> 1].

N个点(x[], y[])的列表,每个代表一个位置。

在每一步中,选择视锥内的所有点,称它们为(px[], py[])。这一步是simple。接下来,我需要在 phone 屏幕上绘制 (px[], py[])。最大的问题是当相机+两点共线时。我对如何处理这个问题一无所知。编辑:两个点都必须显示在屏幕上,所以可能添加一些随机偏移量?

给定相机位置、相机观察方向和一个点 px[i], py[i],它在屏幕上的像素坐标是多少?如果没有足够的信息,那么任何能够处理共线情况的方法都可以。

编辑:

图 1 显示了一个示例。给定点+相机position/direction,点1,2,3,4在视野中。然后,它们显示在屏幕上,如图 2 所示。

2D 的可能解决方案(屏幕上没有 3D 的错觉):

  1. 水平位置:根据相机方向的角度判断是否在屏幕的left/right侧。使用最大角度对角度进行归一化。归一化角度 (0->1) 用于确定该点到 left/right 的距离,其中 normAngle = 0 表示它在屏幕中间,而 normAngle = 1 表示它在屏幕的 leftest/rightest 像素。

  2. 垂直位置:与上面相同,但使用与相机的标准化距离而不是与相机方向的角度。

有没有更好的方法?

您可以将值 point_angle-central_angle 映射到 -Pi/2..Pi/2 (-90..90) 范围(假设零角度指向屏幕顶部),因此请使用带有一些失真的极坐标。

rho = (px - camx)^2 + (py - camy)^2
point_angle = atan2(py - camy, px - camx)
deviation = point_angle - cam_angle

screen_rho = somefunction(rho)  
//in simple case just coefficent C*rho to provide proper distance in screen limits
screen_angle = 3 * deviation   //-30 =>-90 

screen_x = screen_rho * cos(screen_angle)
screen_y = screen_rho * sin(screen_angle)