Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 透视投影-如何转换坐标_C++_Graphics_3d_Rasterizing - Fatal编程技术网

C++ 透视投影-如何转换坐标

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,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.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