• <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>

            天行健 君子當(dāng)自強(qiáng)而不息

            頂點(diǎn)坐標(biāo)變換(5)

            投影變換

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

            Pproj = Pview * Mproj

            下面分別介紹兩種基本的投影變換:正交投影和透視投影,以及它們?cè)贒irect3D中的實(shí)現(xiàn)。

             

            1、正交投影

            正交投影中,投影向量和觀察平面垂直,物體坐標(biāo)沿觀察坐標(biāo)系的z軸平行投影到觀察平面上,觀察點(diǎn)和觀察平面間的距離不會(huì)影響物體的投影大小。

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

            g_device->SetTransform(D3DTS_PROJECTION, &mat_proj);

            下面來(lái)看看正交投影矩陣的生成。對(duì)于正交投影來(lái)說(shuō),它的取景范圍是一個(gè)長(zhǎng)方體,只有在這個(gè)長(zhǎng)方體中的景物才會(huì)被繪制出來(lái)。

            Direct3D擴(kuò)展實(shí)用庫(kù)提供了函數(shù)D3DXMatrixOrthoLH(),用于創(chuàng)建一個(gè)正交投影矩陣,函數(shù)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、透視投影

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

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

            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

            透視投影矩陣的作用是將一個(gè)取景截頭體轉(zhuǎn)換成一個(gè)立方體。因?yàn)榻仡^體的近端比遠(yuǎn)端小,所以靠近攝像機(jī)的對(duì)象將被放大,而對(duì)象距離攝像機(jī)越遠(yuǎn),其成像越小,這就是場(chǎng)景的透視原理。透視變換把一個(gè)取景截頭體轉(zhuǎn)換成一個(gè)新的坐標(biāo)空間,注意,該截頭體變成了一個(gè)立方體,同時(shí),原點(diǎn)從場(chǎng)景的右上角移動(dòng)到了立方體的中心。在透視變換中,x軸和z軸方向的極限都是-1和1,z軸方向?qū)τ谇捌矫娴臉O限是0,對(duì)后平面的極限是1。

            另外,D3DX還提供了下列函數(shù)供程序員創(chuàng)建透視投影變換矩陣:

            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友好投影矩陣

            經(jīng)過(guò)頂點(diǎn)坐標(biāo)變換后,每個(gè)頂點(diǎn)坐標(biāo)將具有4個(gè)元素(x, y, z, w)。Direct3D使用這個(gè)w坐標(biāo)在深度緩沖區(qū)和霧化效果中執(zhí)行一些深度相關(guān)的運(yùn)算。為了能夠使用這個(gè)w坐標(biāo)進(jìn)行深度相關(guān)運(yùn)算,要求投影矩陣必須是w友好投影矩陣(w-friendly projection matrix,也稱作兼容矩陣),即投影矩陣第三行第四列的元素必須是1,以使w坐標(biāo)與世界空間中頂點(diǎn)的z坐標(biāo)相當(dāng)。如果投影變換矩陣第三行第四列的元素不是1,必須將所有的矩陣元素除以投影矩陣第三行第四列元素的值,將投影矩陣變換為w友好投影矩陣。如果沒(méi)有提供一個(gè)w友好投影矩陣,基于深度的霧化效果和深度緩沖就不能正確實(shí)現(xiàn)。

            下面給出的就是從一個(gè)非w友好投影矩陣到w友好投影矩陣的轉(zhuǎn)換。

            Direct3D在進(jìn)行以w為基礎(chǔ)的深度計(jì)算中,需要使用w友好投影矩陣,因此即使應(yīng)用程序不需要進(jìn)行頂點(diǎn)坐標(biāo)變換,也需要設(shè)置一個(gè)w友好投影矩陣。通過(guò)實(shí)用庫(kù)函數(shù)D3DXMatrixPerspectiveFovLH()得到的投影矩陣通常都是w友好投影矩陣,所以通常不需要關(guān)心這個(gè)問(wèn)題。


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


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            公告

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關(guān)鏈接

            搜索

            最新評(píng)論

            日日躁夜夜躁狠狠久久AV| 香蕉久久一区二区不卡无毒影院 | 99久久超碰中文字幕伊人| 亚洲国产精品无码久久久不卡| 囯产精品久久久久久久久蜜桃 | 麻豆久久| 国内精品人妻无码久久久影院 | 熟妇人妻久久中文字幕| 国产国产成人精品久久| 久久亚洲精品国产精品婷婷 | 色婷婷久久综合中文久久蜜桃av| 日产精品久久久一区二区| 国产精品成人99久久久久91gav| 日本国产精品久久| 日本福利片国产午夜久久| 久久久久久久波多野结衣高潮| 亚洲国产成人久久精品影视| 一级做a爰片久久毛片毛片| 91精品国产91久久久久福利| 中文精品99久久国产| 品成人欧美大片久久国产欧美| 久久久久se色偷偷亚洲精品av| 一本久久久久久久| 999久久久免费精品国产| 久久久久精品国产亚洲AV无码| 99久久精品国产毛片| 久久久久久综合一区中文字幕 | 日韩电影久久久被窝网| 狠狠狠色丁香婷婷综合久久五月| 一本一道久久综合狠狠老| 久久这里都是精品| 久久国产亚洲精品| 国产精品久久久久久久人人看 | 青青草国产精品久久久久| 国产亚洲欧美精品久久久| 国产精品一区二区久久精品涩爱 | 久久影院综合精品| 午夜欧美精品久久久久久久| 国产成人久久精品一区二区三区| 97香蕉久久夜色精品国产| 亚洲AV无码久久精品色欲|