【问题标题】:Modelview matrix with perspective correction components具有透视校正组件的模型视图矩阵
【发布时间】:2012-02-10 21:21:54
【问题描述】:

我正在更深入地了解矩阵实现,我在 OpenSceneGraph 矩阵逆计算中发现了以下评论:

We note that this matrix can be split into three matrices.
mat = rot * trans * corr, where rot is rotation part, trans is translation part, and corr is the correction due to perspective (if any).

modelview矩阵分解成矩阵旋转和平移看起来是合理的,但是校正矩阵让我很好奇……

corr 矩阵是重置为单位的模型视图矩阵,除了第四行(使用 OpenGL 表示法)。例如:

corr = [ 1 0 0 0
         0 1 0 0
         0 0 1 0
         x y z s ]

通常,向量c=[x y z s] 等于{0 0 0 1},实际上它对顶点变换没有贡献。但是,既然都涉及到了,那么校正向量是怎么用的呢?

c校正向量的具体应用有哪些?使用这样的矩阵(具有透视校正)对转换后的顶点有什么影响?

【问题讨论】:

    标签: opengl graphics


    【解决方案1】:

    4x4 矩阵在 3D 计算机图形学中的工作方式是:在所有矩阵变换之后,将 4 向量除以第四个 (w) 坐标以获得屏幕坐标:

    [ x ]  -> [ x/w ]
    [ y ]     [ y/w ]
    [ z ]     [ z/w ]
    [ w ]     [w/w=1]
    

    从下面的简化图可以看出,透视投影的几何需要除以一个深度值:

    .  <- viewpoint: (0,0)
    |\
    | \
    |  \
    |   \
    |----+---  <- screen depth = 1  ->  projected point on screen: (x/depth, 1)
    |     \                             (due to geometry of similar triangles)
    |      \
    |       \
    |--------.  <- general point: (x,depth)
    

    矩阵的第四行决定了结果的w坐标,这样最后除法就可以进行透视投影了。 [x/w, y/w] 的值与实际屏幕坐标成正比,[z/w] 通常用于深度缓冲区(尽管它实际上更像是深度的倒数)。

    【讨论】:

    • 在连续变换(即旋转、平移、缩放)期间是否保留此校正?
    • 是的。您可以将旋转/平移/缩放视为应用于正在绘制的对象(在转换序列的一端)或反向应用于相机(在转换序列的另一端)。
    • 事实上,这就是他们称之为“模型视图”矩阵的原因:它是“模型”矩阵(指定建模对象的位置)和“视图”矩阵(其中指定视图相机的位置和特征)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多