• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天行健 君子當自強而不息

            頂點坐標變換(5)

            投影變換

            將攝影空間中的三維物體投影到二維膠片上,也就是Direct3D中的屏幕,這種三維到二維的變換過程就是投影變換,即從取景空間到攝影空間的變換。設三維物體在觀察空間中的坐標為Pview,投影矩陣為Mproj,則頂點在投影空間中的坐標為:

            Pproj = Pview * Mproj

            下面分別介紹兩種基本的投影變換:正交投影和透視投影,以及它們在Direct3D中的實現。

             

            1、正交投影

            正交投影中,投影向量和觀察平面垂直,物體坐標沿觀察坐標系的z軸平行投影到觀察平面上,觀察點和觀察平面間的距離不會影響物體的投影大小。

            工程設計中的頂視圖、前視圖和側視圖就是典型的正交投影。與世界變換、取景變換類似,只需先生成一個投影矩陣mat_proj,然后調用下面的代碼就可以設置投影矩陣:

            g_device->SetTransform(D3DTS_PROJECTION, &mat_proj);

            下面來看看正交投影矩陣的生成。對于正交投影來說,它的取景范圍是一個長方體,只有在這個長方體中的景物才會被繪制出來。

            Direct3D擴展實用庫提供了函數D3DXMatrixOrthoLH(),用于創建一個正交投影矩陣,函數D3DXMatrixOrthoLH()的聲明如下:

            Builds a left-handed orthographic projection matrix.

            D3DXMATRIX * D3DXMatrixOrthoLH(
            D3DXMATRIX * pOut,
            FLOAT w,
            FLOAT h,
            FLOAT zn,
            FLOAT zf
            );

            Parameters

            pOut
            [in, out] Pointer to the resulting D3DXMATRIX.
            w
            [in] Width of the view volume.
            h
            [in] Height of the view volume.
            zn
            [in] Minimum z-value of the view volume which is referred to as z-near.
            zf
            [in] Maximum z-value of the view volume which is referred to as z-far.

            Return Values

            Pointer to the resulting D3DXMATRIX.

            Remarks

            All the parameters of the D3DXMatrixOrthoLH function are distances in camera space. The parameters describe the dimensions of the view volume.

            The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixOrthoLH function can be used as a parameter for another function.

            This function uses the following formula to compute the returned matrix.

            2/w  0    0           0
            0 2/h 0 0
            0 0 1/(zf-zn) 0
            0 0 -zn/(zf-zn) 1
             

            2、透視投影

            透視投影實現的是一個縮放、透視的投影。透視投影的特點是,距離攝像機越遠的物體在投影平面上的成像越小,透視投影的取景范圍是一個截頭體(四棱臺)。這個截頭體稱為取景截頭體(viewing frustum),攝像機位于四棱錐的頂點。這個四棱錐被截頭體的遠平面和近平面分割,遠近裁剪面中間的部分就是取景截頭體,只有這個空間里的對象才是可見的。

            透視投影矩陣的作用就是將取景截頭體內的景物投影到攝像機的二維膠片上,可以利用Direct3D功能擴展庫提供的D3DXMatrixPerspectiveFovLH(),構建一個透視投影矩陣:

            Builds a left-handed perspective projection matrix based on a field of view.

            D3DXMATRIX * D3DXMatrixPerspectiveFovLH(
            D3DXMATRIX * pOut,
            FLOAT fovy,
            FLOAT Aspect,
            FLOAT zn,
            FLOAT zf
            );

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
            fovy
            [in] Field of view in the y direction, in radians.
            Aspect
            [in] Aspect ratio, defined as view space width divided by height.
            zn
            [in] Z-value of the near view-plane.
            zf
            [in] Z-value of the far view-plane.

            Return Values

            Pointer to a D3DXMATRIX structure that is a left-handed perspective projection matrix.

            Remarks

            The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveFovLH function can be used as a parameter for another function.

            This function computes the returned matrix as shown:

            xScale     0          0               0
            0 yScale 0 0
            0 0 zf/(zf-zn) 1
            0 0 -zn*zf/(zf-zn) 0
            where:
            yScale = cot(fovY/2)

            xScale = yScale / aspect ratio

            透視投影矩陣的作用是將一個取景截頭體轉換成一個立方體。因為截頭體的近端比遠端小,所以靠近攝像機的對象將被放大,而對象距離攝像機越遠,其成像越小,這就是場景的透視原理。透視變換把一個取景截頭體轉換成一個新的坐標空間,注意,該截頭體變成了一個立方體,同時,原點從場景的右上角移動到了立方體的中心。在透視變換中,x軸和z軸方向的極限都是-1和1,z軸方向對于前平面的極限是0,對后平面的極限是1。

            另外,D3DX還提供了下列函數供程序員創建透視投影變換矩陣:

            D3DXMatrixPerspectiveLH

            Builds a left-handed perspective projection matrix

            D3DXMATRIX * D3DXMatrixPerspectiveLH(
            D3DXMATRIX * pOut,
            FLOAT w,
            FLOAT h,
            FLOAT zn,
            FLOAT zf
            );

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
            w
            [in] Width of the view volume at the near view-plane.
            h
            [in] Height of the view volume at the near view-plane.
            zn
            [in] Z-value of the near view-plane.
            zf
            [in] Z-value of the far view-plane.

            Return Values

            Pointer to a D3DXMATRIX structure that is a left-handed perspective projection matrix.

            Remarks

            All the parameters of the D3DXMatrixPerspectiveLH function are distances in camera space. The parameters describe the dimensions of the view volume.

            The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveLH function can be used as a parameter for another function.

            This function uses the following formula to compute the returned matrix.

            2*zn/w  0       0              0
            0 2*zn/h 0 0
            0 0 zf/(zf-zn) 1
            0 0 zn*zf/(zn-zf) 0
             

            D3DXMatrixPerspectiveRH

            Builds a right-handed perspective projection matrix.

            D3DXMATRIX * D3DXMatrixPerspectiveRH(
            D3DXMATRIX * pOut,
            FLOAT w,
            FLOAT h,
            FLOAT zn,
            FLOAT zf
            );

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
            w
            [in] Width of the view volume at the near view-plane.
            h
            [in] Height of the view volume at the near view-plane.
            zn
            [in] Z-value of the near view-plane.
            zf
            [in] Z-value of the far view-plane.

            Return Values

            Pointer to a D3DXMATRIX structure that is a right-handed perspective projection matrix.

            Remarks

            All the parameters of the D3DXMatrixPerspectiveRH function are distances in camera space. The parameters describe the dimensions of the view volume.

            The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveRH function can be used as a parameter for another function.

            This function uses the following formula to compute the returned matrix.

            2*zn/w  0       0              0
            0 2*zn/h 0 0
            0 0 zf/(zn-zf) -1
            0 0 zn*zf/(zn-zf) 0

             

            D3DXMatrixPerspectiveFovRH

            Builds a right-handed perspective projection matrix based on a field of view.

            D3DXMATRIX * D3DXMatrixPerspectiveFovRH(
            D3DXMATRIX * pOut,
            FLOAT fovy,
            FLOAT Aspect,
            FLOAT zn,
            FLOAT zf
            );

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
            fovy
            [in] Field of view in the y direction, in radians.
            Aspect
            [in] Aspect ratio, defined as view space width divided by height.
            zn
            [in] Z-value of the near view-plane.
            zf
            [in] Z-value of the far view-plane.

            Return Values

            Pointer to a D3DXMATRIX structure that is a right-handed perspective projection matrix.

            Remarks

            The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveFovRH function can be used as a parameter for another function.

            This function computes the returned matrix as shown.

            xScale     0          0              0
            0 yScale 0 0
            0 0 zf/(zn-zf) -1
            0 0 zn*zf/(zn-zf) 0
            where:
            yScale = cot(fovY/2)

            xScale = yScale / aspect ratio

             

            D3DXMatrixPerspectiveOffCenterLH

            Builds a customized, left-handed perspective projection matrix.

            D3DXMATRIX * D3DXMatrixPerspectiveOffCenterLH(
            D3DXMATRIX * pOut,
            FLOAT l,
            FLOAT r,
            FLOAT b,
            FLOAT t,
            FLOAT zn,
            FLOAT zf
            );

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
            l
            [in] Minimum x-value of the view volume.
            r
            [in] Maximum x-value of the view volume.
            b
            [in] Minimum y-value of the view volume.
            t
            [in] Maximum y-value of the view volume.
            zn
            [in] Minimum z-value of the view volume.
            zf
            [in] Maximum z-value of the view volume.

            Return Values

            Pointer to a D3DXMATRIX structure that is a customized, left-handed perspective projection matrix.

            Remarks

            All the parameters of the D3DXMatrixPerspectiveOffCenterLH function are distances in camera space. The parameters describe the dimensions of the view volume.

            The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveOffCenterLH function can be used as a parameter for another function.

            This function uses the following formula to compute the returned matrix.

            2*zn/(r-l)   0            0              0
            0 2*zn/(t-b) 0 0
            (l+r)/(l-r) (t+b)/(b-t) zf/(zf-zn) 1
            0 0 zn*zf/(zn-zf) 0

            D3DXMatrixPerspectiveOffCenterRH

            Builds a customized, right-handed perspective projection matrix.

            D3DXMATRIX * D3DXMatrixPerspectiveOffCenterRH(
            D3DXMATRIX * pOut,
            FLOAT l,
            FLOAT r,
            FLOAT b,
            FLOAT t,
            FLOAT zn,
            FLOAT zf
            );

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
            l
            [in] Minimum x-value of the view volume.
            r
            [in] Maximum x-value of the view volume.
            b
            [in] Minimum y-value of the view volume.
            t
            [in] Maximum y-value of the view volume.
            zn
            [in] Minimum z-value of the view volume.
            zf
            [in] Maximum z-value of the view volume.

            Return Values

            Pointer to a D3DXMATRIX structure that is a customized, right-handed perspective projection matrix.

            Remarks

            All the parameters of the D3DXMatrixPerspectiveOffCenterRH function are distances in camera space. The parameters describe the dimensions of the view volume.

            The return value for this function is the same value returned in the pOut parameter. In this way, the D3DXMatrixPerspectiveOffCenterRH function can be used as a parameter for another function.

            This function uses the following formula to compute the returned matrix.

            2*zn/(r-l)   0            0                0
            0 2*zn/(t-b) 0 0
            (l+r)/(r-l) (t+b)/(t-b) zf/(zn-zf) -1
            0 0 zn*zf/(zn-zf) 0

            3、w友好投影矩陣

            經過頂點坐標變換后,每個頂點坐標將具有4個元素(x, y, z, w)。Direct3D使用這個w坐標在深度緩沖區和霧化效果中執行一些深度相關的運算。為了能夠使用這個w坐標進行深度相關運算,要求投影矩陣必須是w友好投影矩陣(w-friendly projection matrix,也稱作兼容矩陣),即投影矩陣第三行第四列的元素必須是1,以使w坐標與世界空間中頂點的z坐標相當。如果投影變換矩陣第三行第四列的元素不是1,必須將所有的矩陣元素除以投影矩陣第三行第四列元素的值,將投影矩陣變換為w友好投影矩陣。如果沒有提供一個w友好投影矩陣,基于深度的霧化效果和深度緩沖就不能正確實現。

            下面給出的就是從一個非w友好投影矩陣到w友好投影矩陣的轉換。

            Direct3D在進行以w為基礎的深度計算中,需要使用w友好投影矩陣,因此即使應用程序不需要進行頂點坐標變換,也需要設置一個w友好投影矩陣。通過實用庫函數D3DXMatrixPerspectiveFovLH()得到的投影矩陣通常都是w友好投影矩陣,所以通常不需要關心這個問題。


            posted on 2008-05-02 13:02 lovedday 閱讀(2719) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            国产精品99久久精品爆乳| 国内精品久久久久久野外| 久久av高潮av无码av喷吹| 久久久久亚洲精品天堂久久久久久| 午夜视频久久久久一区| 久久久久久久免费视频| 久久精品国产亚洲av麻豆小说| 欧美久久综合性欧美| 欧美无乱码久久久免费午夜一区二区三区中文字幕| 99久久精品免费| 欧美亚洲国产精品久久高清| 精品久久久久久国产91| 久久这里只有精品视频99| 久久久女人与动物群交毛片 | 2021国产精品午夜久久| 国内高清久久久久久| 国产激情久久久久影院老熟女免费 | 精品国产乱码久久久久软件| 丰满少妇人妻久久久久久| 久久伊人亚洲AV无码网站| 91精品国产综合久久久久久| 久久亚洲日韩看片无码| 久久综合丁香激情久久| 久久亚洲私人国产精品vA| 久久婷婷国产剧情内射白浆| 久久久亚洲精品蜜桃臀| 99国产精品久久| 久久精品亚洲日本波多野结衣| 怡红院日本一道日本久久 | 久久精品国产亚洲AV高清热| 亚洲精品成人久久久| 久久久久亚洲精品无码网址 | 久久久精品久久久久影院| 久久er热视频在这里精品| 久久香综合精品久久伊人| 亚洲va久久久噜噜噜久久狠狠| 2019久久久高清456| 精品国产日韩久久亚洲| 一级a性色生活片久久无| 久久人人爽人人爽人人av东京热| 欧美亚洲另类久久综合婷婷|