3d 将屏幕点投影到三维地平面上

3d 将屏幕点投影到三维地平面上,3d,linear-algebra,perspectivecamera,3d,Linear Algebra,Perspectivecamera,我需要将屏幕上的点投影到透视相机渲染的3D场景的地平面上。吉文斯: 坐标系恰好是左手的,Y向上 我知道我相机的垂直和水平视场(我们分别称它们为F和G;每个视场的一半是F和G) 摄像机是一个观察原点的点E。(或者,在球坐标中指定为距原始坐标的距离d,从地平面向上旋转的角度r,以及围绕垂直+y轴旋转的角度t。) 为简单起见,假设屏幕点指定为从中间到边缘的百分比。(换句话说,屏幕中央的一个点是0,0,中间底部的一个点是0,-1,右上角是1,1,等等。) 给定地平面始终在摄像机的视野内(摄像机不允许向

我需要将屏幕上的点投影到透视相机渲染的3D场景的地平面上。吉文斯:

  • 坐标系恰好是左手的,Y向上
  • 我知道我相机的垂直和水平视场(我们分别称它们为
    F
    G
    ;每个视场的一半是
    F
    G
  • 摄像机是一个观察原点的点
    E
    。(或者,在球坐标中指定为距原始坐标的距离
    d
    ,从地平面向上旋转的角度
    r
    ,以及围绕垂直+y轴旋转的角度
    t
    。)
  • 为简单起见,假设屏幕点指定为从中间到边缘的百分比。(换句话说,屏幕中央的一个点是
    0,0
    ,中间底部的一个点是
    0,-1
    ,右上角是
    1,1
    ,等等。)
  • 给定地平面始终在摄像机的视野内(摄像机不允许向下倾斜到任何地平线以上的点都在屏幕上)
从2D开始工作,如果屏幕点仅位于屏幕中心线(x=0),我有一个解决方案。但是,我不知道如何将X偏移考虑在内


这是我到目前为止所拥有的。我们忽略垂直方向的
t
旋转,在二维方向工作

  • O
    是摄像机的原点(摄像机的“注视目标”)
  • E
    是相机的视点
  • P
    是我们试图找到的点(或者实际上是距离
    n
  • r
    是摄像机的倾斜角度(已知)
  • d
    E
    O
    之间的距离(已知)
  • f
    是相机总垂直视场的一半
  • 我们知道,屏幕点
    screenYPct
    的y值与比率
    a/(a+b)
我们发现角度
g
screenYPct
f
方面如下:

tan(g) = a/(bottom of upper triangle)
tan(f) = (a+b)/(bottom of upper triangle)
a/(a+b) = tan(g)/tan(f)
g = atan( screenYPct * tan(f) )
眼点的高度
y
为:
d*sin(r)

视点和相机原点之间的地面距离
m
为:
d*cos(r)

角度
s
(以度为单位)仅为:
90-r

因此,距离
n
(在
P
和原点
O
之间)可通过以下方式找到:

tan(g+s) = (m+n)/y
n = y * tan(g+s) - m
n = d * ( sin(r) * tan(atan( screenYPct * tan(f) ) + 90 - r) - cos(r) )
给定
n
,然后我可以围绕地平面上的原点旋转
p
,旋转角度
t
,以找到
p
的地面
(x,z)


但是…再一次,这都是假设原始屏幕点位于屏幕的水平中间。当屏幕点偏离中线时,我如何才能找到地面上的点?

对于好奇的人来说,这样做的动机是在自定义3D引擎中跟踪多个触摸点,以确保捏/缩放/旋转/平移手势始终保持几何体的点在手指下。我相信我已经做到了;在我写答案之前,需要对其进行编码以进行测试,但关键是找到类似于
g
的水平角度偏差,然后使用从
E
P
的距离,找出在旋转
t
之前正交移动的距离。从给定的屏幕坐标在世界坐标系中投射一条光线并使该光线与地平面相交不是更容易吗?@user3146587如果我有相机的矩阵,那么是的,代码对我来说会更容易(尽管最终会使用一些不必要的数学)。但是,我没有当前可用的摄影机变换矩阵。如果没有从世界坐标映射到屏幕坐标的实际变换/投影,如何能够恢复与地平面的精确交点。您至少应该拥有计算变换/投影矩阵所需的所有参数,对吗?