zoukankan      html  css  js  c++  java
  • DirectX视口变换矩阵详解

    视口变换在投影变换之后,视口变换的作用是将投影*面上的点转换为屏幕上的点,这是一个缩放的过程。

    投影变换的作用是将viewing frustum(视景体)中的场景投影到一个*面上,这个*面就是投影*面,在DirectX中,使用*剪裁*面作为投影*面(z=1),关于透视投影的矩阵求解,请参考透视投影详解



    视口变换则是将这个cuboid中的物体变换到视口中,见下图。


    其中
    cuboid的坐标范围是

     

    viewport的坐标范围是

    注:由上图知,视口的起点为(X, Y),宽高分别为WidthHeightx轴向右为正,y轴向下为正,y轴的方向与三维坐标正好相反。视口是一个2D*面,但是在viewport变换中,Z坐标也是跟着变换的,只是在这个图中没有体现。

    先求变换矩阵的第一列

    Cuboid中的左上角点(-1, 1, 0, 1)映射到viewport中的起点(X, Y, MinZ, 1),

    Cuboid中的右上角点(1, 1, 0, 1)映射到viewport中的点(X+Width, Y, MinZ, 1),

    假设变换矩阵的第一列为[x’, y’, z’, 1]T据矩阵乘法有

    [-1, 1, 0, 1]* [x’, y’, z’, 1]T = X

    [1, 1, 0, 1]* [x’, y’, z’, 1]T = X+Width

    对应的两个方程为

    -1*x’ + 1*y’ + 0*z’ + 1*w’ = X

    1*x’ + 1*y’ + 0*z’ + 1*w’ = X+Width

    解之得

    x’ = Width/2

    y’ = 0

    z’ = 0

    w’ = x + Width/2

    再求第二列

    列方程(这里省略了x’,z’,但结果不变,下同)

    y’ + 1*w’=Y

    -1*y’ + 1*w’=Y+Height

    解之得

    y’ = -Height/2

    w’ = Y + Height/2

    最后求第三列

    列方程

    0*z’ + 1*w’ = MinZ

    1*z’ + 1*w’ = MaxZ

    解之得

    z’ = MaxZ – MinZ

    w’ = MinZ

    组合以上各列,得到视口变换矩阵

     

    作者:zdd
    出处:http://www.cnblogs.com/graphics/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    LeetCode Longest Uncommon Subsequence II
    Leetcode Longest Uncommon Subsequence I
    LeetCode 557. Reverse Words in a String III
    LeetCode 394. Decode String
    LeetCode 419. Battleships in a Board
    LeetCode 366. Find Leaves of Binary Tree
    LeetCode 408. Valid Word Abbreviation
    LeetCode 532. K-diff Pairs in an Array
    LeetCode Minimum Absolute Difference in BST
    LeetCode 414. Third Maximum Number
  • 原文地址:https://www.cnblogs.com/graphics/p/1582773.html
Copyright © 2011-2022 走看看