如何将 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 的错觉):
水平位置:根据相机方向的角度判断是否在屏幕的left/right侧。使用最大角度对角度进行归一化。归一化角度 (0->1) 用于确定该点到 left/right 的距离,其中 normAngle = 0
表示它在屏幕中间,而 normAngle = 1
表示它在屏幕的 leftest/rightest 像素。
垂直位置:与上面相同,但使用与相机的标准化距离而不是与相机方向的角度。
有没有更好的方法?
您可以将值 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)
我正在尝试将 (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 的错觉):
水平位置:根据相机方向的角度判断是否在屏幕的left/right侧。使用最大角度对角度进行归一化。归一化角度 (0->1) 用于确定该点到 left/right 的距离,其中
normAngle = 0
表示它在屏幕中间,而normAngle = 1
表示它在屏幕的 leftest/rightest 像素。垂直位置:与上面相同,但使用与相机的标准化距离而不是与相机方向的角度。
有没有更好的方法?
您可以将值 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)