透视变换矩阵的计算

时间:2011-03-11 01:00:27

标签: math 3d matrix projection

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

3 个答案:

答案 0 :(得分:4)

好的,让我们试着解决这个问题,扩展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 ]

按照上面的第一组方程式

答案 1 :(得分:1)

我猜你所说的投影,正如Beta所说,包含在:

之间的交叉点
  • 由原点O(0, 0, 0)和要转换的点P(a, b, c)形成的行
  • 和飞机z=d

如果我是对的,那么让我们看看这一行的等式,由矢量乘积OP ^ OM = 0给出(让我们提醒两个给定点A之间的直线方程和BAB ^ AM = 0提供M(x, y, z);这是矢量产品,因此所有都是向量:0表示空向量,AB是向量AB等):

bz - cy = 0
cx - az = 0
cz - bx = 0

使用z = d,我们只有2个线性独立的方程式:

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表达式。我对齐次坐标可能不太熟悉。

答案 2 :(得分:1)

均匀变换矩阵是(Euler roll-pitch-yaw):

|r1 r2 r3 dx|
|r4 r5 r6 dy|
|r7 r8 r9 dz|
|px py pz sf|

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

从这里开始,如果你使用这个的倒数,你可以通过输入目标平面的旋转以及它的参考位置来确定任意平面中的投影。 (对于纯运动学,将透视矢量保持在0 0 0和sf = 1),得到T-> T * = T1。获取T1 ^ -1(对于运动学,这只是R'(转置),水平连接-R' * d,然后垂直连接简单为0 0 0 1)。

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

然后,v(新)=(T1 ^ -1)* v(旧),完成工作。