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

            天行健 君子當自強而不息

            頂點坐標變換(4)

            取景變換

            取景變換(也稱觀察變換)是在世界空間下架設一個攝像機,把各個頂點坐標從世界空間變換到攝影空間(觀察空間)。在攝影空間里,攝像機或者說觀察點位于原點,向著z軸正方向。因為Direct3D采用左手坐標系,所以z軸正方向指向屏幕里面。設三維頂點在世界坐標系的坐標為Pworld,在攝影空間內的坐標為Pview,則:

            Pview = Pworld * Mview

            矩陣Mview稱為觀察矩陣。觀察矩陣根據攝像機在世界空間中的位置(即攝影空間的原點在世界坐標系中的相對位置)和攝像機的觀察方向在世界空間中的方向,將世界坐標系下的對象重新定位。在Direct3D中設置觀察矩陣非常簡單,首先調用Direct3D擴展實用庫提供的函數D3DXMatrixLookAtLH(),生成一個基于左手坐標系的觀察矩陣,該函數聲明如下:

            Builds a left-handed, look-at matrix.

            D3DXMATRIX * D3DXMatrixLookAtLH(
            D3DXMATRIX * pOut,
            CONST D3DXVECTOR3 * pEye,
            CONST D3DXVECTOR3 * pAt,
            CONST D3DXVECTOR3 * pUp
            );

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that is the result of the operation.
            pEye
            [in] Pointer to the D3DXVECTOR3 structure that defines the eye point. This value is used in translation.
            pAt
            [in] Pointer to the D3DXVECTOR3 structure that defines the camera look-at target.
            pUp
            [in] Pointer to the D3DXVECTOR3 structure that defines the current world's up, usually [0, 1, 0].

            Return Values

            Pointer to a D3DXMATRIX structure that is a left-handed, look-at matrix.

            Remarks

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

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

            zaxis = normal(At - Eye)
            xaxis = normal(cross(Up, zaxis))
            yaxis = cross(zaxis, xaxis)

            xaxis.x yaxis.x zaxis.x 0
            xaxis.y yaxis.y zaxis.y 0
            xaxis.z yaxis.z zaxis.z 0
            -dot(xaxis, eye) -dot(yaxis, eye) -dot(zaxis, eye) 1

            然后調用函數IDirect3DDevice9::SetTransform(D3DTS_VIEW, &mat_view)設置觀察矩陣,其中mat_view為函數D3DXMatrixLookAtLH()生成的觀察矩陣。

            當然,也可以使用函數D3DXMatrixLookAtRH()建立一個基于右手坐標系的觀察矩陣,但因為Direct3D采用左手坐標系,所以通常不使用此函數。

            創建并設置一個觀察矩陣的方法很容易,但真正理解構造觀察矩陣原理卻不像理解構造世界變換矩陣那么容易。有多種方法可以建立觀察矩陣,但無論對于哪種情況,攝像機都有自己在世界空間下的邏輯位置和方向。觀察矩陣的任務就是完成對象的平移和旋轉,從而把它們定位在攝影空間里,而此時攝像機位于攝影空間的原點。所以,一種創建觀察矩陣的方法是用一個平移矩陣以及各個軸的旋轉矩陣來實現。下面以這種方法為例較簡單介紹構造觀察矩陣的原理。這種方法使用下面的矩陣運算公式:

            V = T * Rz * Ry * Rx

            在這個公式里,V是將要創建的觀察矩陣,T是世界坐標系下的一個平移矩陣,Rx、Ry和Rz是繞x、y和z軸的旋轉矩陣。這些平移矩陣和旋轉矩陣以世界空間下攝影機的邏輯位置和方向為基礎。所以,如果一個攝影機在世界空間下的邏輯位置是(10, 20, 100),平移矩陣的作用是將對象沿x軸移動10個單位,沿y軸移動20個單位,沿z軸移動100個單位。公式中的旋轉矩陣以攝像機的方向為基礎,表示攝影空間里的坐標軸相對于世界空間坐標軸應該旋轉多少度。例如,如果攝像機的方向垂直向下時,攝影空間的z軸偏離世界空間z軸90度。那么就需要用公式中的旋轉矩陣對場景里的所有對象繞x軸旋轉負90度,也就是說,這時的旋轉是與偏離程度是等大反向的。把前面的平移矩陣和這個旋轉矩陣連接起來,就創建了一個觀察矩陣V。用它來調整場景里對象的位置和方向,使得它們的頂部沖著攝影機的鏡頭,就好像攝像機從對象的頂部向下拍攝一樣。


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

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久99精品久久久久久hb无码| 欧美成a人片免费看久久| 2020国产成人久久精品| 少妇精品久久久一区二区三区| 国产精品久久久久影院嫩草 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久99国产精品成人欧美| 国产精品久久久久蜜芽| 国产99久久精品一区二区| 亚洲中文字幕伊人久久无码| 成人综合伊人五月婷久久| 日韩久久久久中文字幕人妻 | 久久久一本精品99久久精品88| 国产成人久久AV免费| 亚洲国产成人久久综合碰| 精品午夜久久福利大片| 亚洲综合久久夜AV | 丰满少妇人妻久久久久久4| 久久午夜羞羞影院免费观看| 婷婷久久五月天| 久久影院午夜理论片无码| 久久久青草久久久青草| 亚洲AV无码1区2区久久| 亚洲午夜无码久久久久小说| 成人精品一区二区久久| 香蕉久久夜色精品国产小说| 久久久久久亚洲Av无码精品专口 | 久久国产亚洲精品麻豆| 精品国产乱码久久久久久郑州公司| 久久久久亚洲AV成人网人人网站| 久久久国产精品| 久久99精品久久久久久水蜜桃 | 久久久婷婷五月亚洲97号色| 欧美粉嫩小泬久久久久久久| 久久中文字幕无码专区| 久久久精品视频免费观看| 久久久国产精品| 国产精品一区二区久久精品涩爱 | 久久精品国产一区| A级毛片无码久久精品免费| 国产精品成人99久久久久 |