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

            天行健 君子當自強而不息

            設計一個靈活的Camera類(2)

            12.2.2圍繞任意軸旋轉

            為了實現我們的攝像機旋轉方法,我們需要能夠繞著任意軸旋轉,D3DX庫提供下面的函數來解決這個問題:

            Builds a matrix that rotates around an arbitrary axis.

            D3DXMATRIX * D3DXMatrixRotationAxis(  D3DXMATRIX * pOut,  CONST D3DXVECTOR3 * pV,  FLOAT Angle);

            Parameters

            pOut
            [in, out] Pointer to the D3DXMATRIX structure that     is the result of the operation.
               
            pV
            [in] Pointer to the arbitrary axis. See     D3DXVECTOR3.
               
            Angle
            [in] Angle of rotation in radians. Angles are     measured clockwise when looking along the rotation axis toward the origin.   

            Return Values

            Pointer to a D3DXMATRIX structure rotated around the specified axis.

            Remarks

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

            例如,假如我們想繞向量(0.707, 0.707, 0)軸旋轉π/2角度。我們可以這樣寫:

                           
                   

                    D3DXMATRIX R;

                   

                    D3DXVECTOR3 axis(0.707f,         0.707f, 0.0f);

                   

                    D3DXMatrixRotationAxis(&R,         &axis, D3DX_PI / 2.0f);

             

            12.2.3PitchYawRoll

            因為方向向量描述了攝像機相對于世界坐標系的方向,我們必須考慮在使用傾斜(pitch)、偏航(yaw)和滾轉(roll)時及時更新方向向量。這其實也是非常簡單的。圖12.4,12.512.6分別顯示了攝像機的傾斜、偏航和滾轉操作。

            傾斜(pitch)時,我們需要將uplook向量繞著right向量旋轉一定角度。同樣的,偏航(yaw)時,我們需要將lookright向量繞著up向量旋轉一定角度。最后,滾轉(roll)時,我們需要將upright向量繞著look向量旋轉一定角度。

            我們現在明白了為什么D3DXMatrixRotationAxis函數是非常必要的,因為這三個向量中的任何一個都可能圍繞世界坐標系中的任意軸旋轉。

            對于傾斜(pitch)、偏航(yaw)和滾轉(roll)的執行我們已經討論了。然而,對于LAND_OBJECT模式就有一些限制。我們在偏航(yaw)方法中只圍繞y軸旋轉,我們完全屏蔽滾轉(roll)。當然你可以根據你的程序需要來改變Camera類。我們這里只是一個示例而已。

            傾斜(pitch)、偏航(yaw)和滾轉(roll)方法代碼的具體實現如下:

                void cCamera::pitch(float angle)
                {
                    D3DXMATRIX transform_matrix;
                    D3DXMatrixRotationAxis(&transform_matrix, &m_right, angle);
               
                    
            // rotate m_up and m_look around m_right vector
               
                    D3DXVec3TransformCoord(&m_up,   &m_up,   &transform_matrix);
                    D3DXVec3TransformCoord(&m_look, &m_look, &transform_matrix);
                }
               
               
            void cCamera::yaw(float angle)
                {
                    D3DXMATRIX transform_matrix;
               
                    
            // rotate around world y-axis (0, 1, 0) always for land object
               
                if(m_camera_type == LAND_OBJECT)
                        D3DXMatrixRotationY(&transform_matrix, angle);
                    
            else    // rotate around own up vector for aircraft
               
                        D3DXMatrixRotationAxis(&transform_matrix, &m_up, angle);
               
                    
            // rotate m_right and m_look around m_up or y-axis
               
                    D3DXVec3TransformCoord(&m_right, &m_right, &transform_matrix);
                    D3DXVec3TransformCoord(&m_look,  &m_look,  &transform_matrix);
                }
               
               
            void cCamera::roll(float angle)
                {
                    
            // only roll for aircraft type
               
                if(m_camera_type == AIR_CRAFT)
                    {
                        D3DXMATRIX transform_matrix;
                        D3DXMatrixRotationAxis(&transform_matrix, &m_look, angle);
               
                        
            // rotate m_up and m_right around m_look vector
               
                        D3DXVec3TransformCoord(&m_up,     &m_up,        &transform_matrix);
                        D3DXVec3TransformCoord(&m_right, &m_right,  &transform_matrix);
                    }
                }

            12.2.4Walking、StrafingFlying

            當提到walking時,我們的意思是在我們觀察的方向上移動位置(也就是說,沿著look向量)。Strafing是說在我們觀察方向的左右移動,也就是沿著right向量移動。最后,我們說flying就是沿著up向量移動。為了沿著這些軸移動,我們只需要簡單地加一個向量就可以了(如圖12.7)。

            就象旋轉一樣,我們需要對移動作一些限制。例如,LAND_OBJECT不允許飛起來。因此我們把移動限制在xz平面。然而,因為LAND_OBJECT能夠允許爬樓梯和登山,所以,我們設置cCamera::set_position方法,它允許你手動設置你的攝像機位置來達到你的高度和位置。

            移動(walk)、平移(strafe)和飛行(fly)方法代碼的具體實現如下:

                void cCamera::walk(float units)
                {
                    
            // move only on xz plane for land object
               
                if(m_camera_type == LAND_OBJECT)
                        m_pos += D3DXVECTOR3(m_look.x, 0.0f, m_look.z) * units;
                    
            else    // AIR_CRAFT
               
                    m_pos += m_look * units;
                }
               
               
            void cCamera::strafe(float units)
                {
                    
            // move only on xz plane for land object
               
                if(m_camera_type == LAND_OBJECT)
                        m_pos += D3DXVECTOR3(m_right.x, 0.0f, m_right.z) * units;
                    
            else    // AIR_CRAFT
               
                    m_pos += m_right * units;
                }
               
               
            void cCamera::fly(float units)
                {
                    
            // move only on y_axis for land object
               
                if(m_camera_type == LAND_OBJECT)
                        m_pos.y += units;
                    
            else
                        m_pos += m_up * units;
                }

            posted on 2008-03-30 15:07 lovedday 閱讀(1968) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            久久精品视频网| 亚洲精品蜜桃久久久久久| 狠狠色丁香久久综合五月| 国产精品久久久久久福利漫画 | 久久e热在这里只有国产中文精品99 | 久久午夜福利无码1000合集| 久久精品青青草原伊人| 国产精品久久自在自线观看| 国产国产成人久久精品| 亚洲午夜久久久久久久久久| 久久国产精品成人免费 | 久久久久亚洲AV无码去区首| 久久中文字幕人妻熟av女| 91精品国产高清久久久久久国产嫩草 | 国产精品免费久久久久久久久| 久久伊人五月丁香狠狠色| 亚洲国产精品人久久| 久久综合狠狠综合久久| 久久久久九九精品影院| 久久福利青草精品资源站| 亚洲午夜久久久久久久久电影网 | AA级片免费看视频久久| 久久夜色精品国产噜噜亚洲AV | 99久久国产综合精品五月天喷水 | 性高湖久久久久久久久AAAAA| 国产麻豆精品久久一二三| 伊人久久综合无码成人网| 色婷婷久久综合中文久久一本| 亚洲国产精品热久久| 国产午夜久久影院| 国产一区二区三区久久| 久久久久久久久久久久中文字幕 | 俺来也俺去啦久久综合网| 精品国产乱码久久久久久呢 | 狠狠色婷婷久久综合频道日韩| 久久亚洲中文字幕精品一区| 国产精品99久久久久久董美香 | 婷婷久久综合九色综合绿巨人| 久久97久久97精品免视看秋霞 | 久久久久久人妻无码| 久久99国产乱子伦精品免费|