C++ 透视投影-如何转换坐标
我正在研究透视投影,我偶然发现了这个概念: 基本上它说,如果我有一个点(x,y,z),我可以通过执行以下操作将其投影到透视屏幕(相机空间)C++ 透视投影-如何转换坐标,c++,graphics,3d,rasterizing,C++,Graphics,3d,Rasterizing,我正在研究透视投影,我偶然发现了这个概念: 基本上它说,如果我有一个点(x,y,z),我可以通过执行以下操作将其投影到透视屏幕(相机空间) 我不明白为什么x'=x/z或y'=y/z看这个问题的一种方法是,你要做的是,与一条线相交,这条线穿过观察者的位置(假设在原点:0,0,0),以及你希望投影的空间点(p) 因此,取直线方程,即p'=p*a,其中a只是一个标量值,求出p'.Z=1(即投影平面所在的位置)。当标量倍数为1/P.Z时,这是非常正确的,因此投影点为(P.X,P.Y,P.Z)*(1/P
我不明白为什么x'=x/z或y'=y/z看这个问题的一种方法是,你要做的是,与一条线相交,这条线穿过观察者的位置(假设在原点:
0,0,0
),以及你希望投影的空间点(p)
因此,取直线方程,即
p'=p*a
,其中a
只是一个标量值,求出p'.Z=1
(即投影平面所在的位置)。当标量倍数为1/P.Z
时,这是非常正确的,因此投影点为(P.X,P.Y,P.Z)*(1/P.Z)
几何上,它是一个类似三角形的问题
在图表中,因为(x,y,x)
与(x',y',z')
位于同一虚线上:
这意味着相应的边具有固定的比率。此外,原始向量与投影向量成比例。最后,请注意,概念投影平面位于z'=1
:
(x,y,z) / z = (x',y',z') / z'
-> so, since z' = 1:
x'/z' = x' = x/z
y'/z' = y' = y/z
[警告:请注意,我的答案中的
z'
与其在问题中的出现不同。问题的z'=f(z-n)/z(f-n)
与物理点不直接对应:它是一个“深度值”,用于执行隐藏面移除等操作。]同构坐标赋予我们在无穷远处表示点/线的能力。
我们在向量表示中添加1。三维空间中点的距离越远,它就越倾向于向光学中心移动。
笛卡尔到齐次
p=(x,y)到(x,y,1)
齐次笛卡尔
(X,Y,Z)至(X/Z,Y/Z)
例如,
1.当你坐在飞机上旅行时,当你向下看的时候,点从一个瞬间移动到另一个瞬间的速度似乎并不快。这是距离非常大,距离=1/视差(两帧中同一点的漂移)。
2.尝试在视差中替换为无穷大,这意味着距离为0。这是因为距离您越远,x或y位移对其外观位置的影响越小。考虑一下在你的眼睛前方10厘米,向左或向右移动1米。如果同一物体在你眼前3米处,并以同样的1米位移移动,那么它看起来会移动(在你的视野中移动的比例会更大)。
triangle [(0,0,0), (0,0,z), (x,y,z)]
is similar to
triangle [(0,0,0), (0,0,z'), (x',y',z')]
(x,y,z) / z = (x',y',z') / z'
-> so, since z' = 1:
x'/z' = x' = x/z
y'/z' = y' = y/z