【问题标题】:Calculation of a perspective transformation matrix透视变换矩阵的计算
【发布时间】:2011-03-11 01:00:27
【问题描述】:

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

【问题讨论】:

  • 你想要什么形式的投影?你真的只是在谈论(X,Y,Z) => (X,Y,D),一个 D-Z 在 Z 轴上的矩阵平移吗?您是否试图找到原点和点之间的线段与偏移 Z=D 平面的交点?您的问题需要更多详细信息。
  • 是否需要一个特定于该点的矩阵,或者您是否想要一个将任何点(除了原点)投影到 z=d 平面上的常量矩阵,沿来自原点的射线?
  • 你检查en.wikipedia.org/wiki/3D_projection了吗?我认为它包含您的答案以及对计算的解释。
  • 你要求形成一个透视投影变换矩阵,它不同于透视变换矩阵。
  • 我刚刚在stackoverflow.com/questions/24163987/…详细回答了这个问题

标签: math 3d matrix projection


【解决方案1】:

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

根据上面的第一组方程

【讨论】:

    【解决方案2】:

    我猜你的意思是,正如 Beta 所说的那样,包括:

    • 原点O(0, 0, 0)和待变换点P(a, b, c)形成的直线
    • 和飞机z=d

    如果我是对的,那么让我们看看这条线的方程,由矢量积 OP ^ OM = 0 给出(让我们提醒一下,两个给定点 AB 之间的一条线的方程是由AB ^ AM = 0给出,与M(x, y, z);这是一个向量积,所以都是向量:0代表空向量,AB是向量AB等):

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

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

    【讨论】:

    • 您的解释不清楚 - M 有什么意义,为什么向量 OP 与向量 OM 正交?
    • +1,但是由于你是用d/c缩放的,所以我认为矩阵中的缩放元素1/s应该是c/d。
    • @Alnitak:确实,我试图澄清这一点。 @antonakos:你能开发吗?我找不到正确矩阵的事实取决于我将c 作为分母...
    • 将这条线描述为一组联立方程会使它过于复杂恕我直言 - 它实际上是简单的几何形状。
    • 如果要按s = d/c进行缩放,那么矩阵中位置(4,4)的元素应该是1/s = c/d。见en.wikipedia.org/wiki/…
    【解决方案3】:

    齐次变换矩阵为(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(new) = (T1^-1)*v(old),工作完成。

    【讨论】:

      猜你喜欢
      • 2016-06-09
      • 2011-03-09
      • 2014-04-06
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      • 2021-04-09
      • 2013-10-27
      相关资源
      最近更新 更多