Math 透视变换矩阵的计算

Math 透视变换矩阵的计算,math,3d,matrix,projection,Math,3d,Matrix,Projection,给定三维空间中的一个点,我如何计算齐次坐标中的矩阵,该矩阵将该点投影到平面z==d,其中原点是投影的中心。我猜你的意思是,正如Beta所说,投影包含在以下两点之间的交点: 由原点O(0,0,0)和要转换的点P(a,b,c)形成的线 平面z=d 如果我是对的,那么让我们看看这条线的方程,由向量积给出(让我们提醒一下,在两个给定点之间的一条线的方程,a和B由AB^AM=0给出,带m(x,y,z);这是一个向量积,所以所有的都是向量:0表示空向量,AB表示向量AB,等等): 对于z=d,我们只有两

给定三维空间中的一个点,我如何计算齐次坐标中的矩阵,该矩阵将该点投影到平面
z==d
,其中原点是投影的中心。

我猜你的意思是,正如Beta所说,投影包含在以下两点之间的交点:

  • 由原点
    O(0,0,0)
    和要转换的点
    P(a,b,c)
    形成的线
  • 平面
    z=d
如果我是对的,那么让我们看看这条线的方程,由向量积给出(让我们提醒一下,在两个给定点之间的一条线的方程,
a
B
AB^AM=0
给出,带
m(x,y,z)
;这是一个向量积,所以所有的都是向量:
0
表示空向量,
AB
表示向量
AB
,等等):

对于
z=d
,我们只有两个线性独立的方程:

bd = cy
cx = ad
所以这个投影将一个点
p(a,b,c)
转换成一个点
p'(ad/c,bd/c,d)
。对于齐次坐标,给出:

P'(ad/c, bd/c, d) = P'(ad/c, bd/c, cd/c)
                  = P'(ad/c: bd/c: cd/c: 1)
                  = P'(a: b: c: d/c)
编辑:我第一次找到的矩阵是:

    1, 0, 0, 0
    0, 1, 0, 0
A = 0, 0, 1, 0
    0, 0, 0, d/c

但是它使用
c
,这是点
p
的a坐标!!这是胡说八道,我找不到不使用这些坐标的
A
表达式。我可能对齐次坐标不太熟悉。

好的,让我们试着解决这个问题,扩展Emmanuel的答案

假设视图向量直接沿Z轴,则必须按视图平面距离
d
与原始
Z
坐标的比率缩放所有尺寸。该比率为d/z,给出:

x' = x * (d / z)
y' = y * (d / z)
z' = z * (d / z)    ( = d)
在同质坐标系中,通常从p=
[x,y,z,w]
开始,其中
w==1
,转换如下:

P' = M * P
结果将具有
w!=1
,为了得到真实的3D坐标,我们通过将整个物体除以它的
w
分量来归一化同质向量

所以,我们所需要的是一个矩阵,给定的
[x,y,z,1
]给我们
[x*d,y*d,z*d,z]
,即

| x' |  =    | d   0   0   0 |  *  | x |
| y' |  =    | 0   d   0   0 |  *  | y |
| z' |  =    | 0   0   d   0 |  *  | z |
| w' |  =    | 0   0   1   0 |  *  | 1 |
归一化后(除以
w'==z
)得到:

[ x * d / z, y * d / z,   d,   1 ]

根据上述第一组方程,齐次变换矩阵为(欧拉横摇横摇):

r1-9是组合旋转矩阵的元素:Rx*Ry*Rz(算出) dx-dy和dz是位移矢量(d)元素 px-py和pz是透视向量(p)元素 sf是比例因子

从这里开始,如果你使用这个的倒数,你得到你的投影作为一个透视图在任意平面上通过你的目标平面的旋转,以及它的原点位置wrt参考一个(保持透视向量为0,纯运动学为sf=1),你得到T->T*=T1。获取T1^-1(对于运动学,这是简单的R'(转置),水平方向由-R'*d连接,然后垂直方向由01连接)

可以有多个平面,例如a、b、c作为链,在这种情况下T1=Ta*Tb*Tc*


然后,v(new)=(T1^-1)*v(old),任务完成。

您想要什么形式的投影?你真的在说Z轴上D-Z的矩阵平移吗?是否尝试查找原点和点之间的线段与偏移Z=D平面的交点?您的问题需要更多详细信息。是否需要一个特定于该点的矩阵,还是需要一个常量矩阵将任何点(原点除外)投影到z=d平面上,沿原点的光线?您检查了吗?我想它包含了你的答案,以及关于计算的解释。你在问透视投影变换矩阵,这与透视变换矩阵不同。我刚才在你的解释中详细回答了这个问题,但不清楚-什么是点
M
,为什么向量
OP
与向量
OM
正交?+1,但既然你是用d/c进行缩放,我认为矩阵中的缩放元素1/s应该是c/d。@Alnitak:的确,我试图澄清这一点@安东纳科斯:你能发展一下吗?我找不到一个正确的矩阵这一事实依赖于我将
c
作为分母这一事实……将直线描述为一组联立方程使得它太复杂了,因为它实际上是简单的几何体。如果你想按s=d/c进行缩放,那么矩阵中位置(4,4)处的元素应该是1/s=c/d。看见
[ x * d / z, y * d / z,   d,   1 ]
|r1 r2 r3 dx|
|r4 r5 r6 dy|
|r7 r8 r9 dz|
|px py pz sf|