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

            天行健 君子當自強而不息

            D3D編程必備的數學知識(5)

            平面

            D3DX平面

            在代碼中描述一個平面:僅僅需要一個法向量n和常數d就可以了。因此我們就使用一個4D向量(我們記錄成(n, d))來實現它。D3DX庫中用如下的結構來定義一個平面:

            typedef struct D3DXPLANE
            {
            #ifdef __cplusplus
            public:
            D3DXPLANE() {}
            D3DXPLANE( CONST FLOAT* );
            D3DXPLANE( CONST D3DXFLOAT16* );
            D3DXPLANE( FLOAT a, FLOAT b, FLOAT c, FLOAT d );

            // casting
            operator FLOAT* ();
            operator CONST FLOAT* () const;

            // unary operators
            D3DXPLANE operator + () const;
            D3DXPLANE operator - () const;

            // binary operators
            BOOL operator == ( CONST D3DXPLANE& ) const;
            BOOL operator != ( CONST D3DXPLANE& ) const;
            #endif //__cplusplus
            FLOAT a, b, c, d;
            } D3DXPLANE, *LPD3DXPLANE;

            對照等式(8)可知:這里a, b和c是平面法向量n的成員,d就是那個常數。

             

            點和平面的空間關系

            我們判定點和平面的關系主要是利用等式(8)來實現。例如,假設平面(n, d),我們能判定點p和平面的關系

                   假如n·p + d = 0,那么點p與平面共面。

                   假如n·p + d >0,那么點p在平面的前面且在平面的正半空間里。

                   假如n·p + d <0,那么點p在平面的背面且在平面的負半空間里。

             

            下邊的D3DX函數就是利用n·p + d 來判定點和平面的關系的函數:

            FLOAT D3DXPlaneDotCoord(

                   CONST D3DXPLANE *pP, // 平面

                   CONST D3DXVECTOR3 *pV // 點

            );

            // 測試點相對于平面的位置

            D3DXPLANE p(0.0f, 1.0f, 0.0f, 0.0f);

            D3DXVECTOR3 v(3.0f, 5.0f, 2.0f);

            float x = D3DXPlaneDotCoord( &p, &v );

             

            if( x approximately equals 0.0f ) // v在平面.上

            if( x > 0 ) // v在正半空間

            if( x < 0 ) // v在負半空間

             

            創建平面

            我們能通過兩種方法創建平面。

            第一種方法,直接用指定法線和點創建平面。假設法線n和在平面上的已知點p0,我們就能求出d:

            n·p0+ d = 0

            n·p0 = -d

            -n·p0 = d

             

            D3DX庫提供如下函數來完成創建平面的任務:

            D3DXPLANE *D3DXPlaneFromPointNormal(

                   D3DXPLANE* pOut, // Result.

                   CONST D3DXVECTOR3* pPoint, // Point on the plane.

                   CONST D3DXVECTOR3* pNormal // The normal of the plane.

            );

             

            第二種方法我們能通過在平面上的3個點創立一個平面

            假如有點p0, p1, p2,那么我們就能得到平面上的兩個向量:

            u = p1 - p0

            v = p2 - p0

             

            因此我們能通過把平面上的兩個向量進行叉乘得到平面的法線。回憶左手坐標系。

            n = u × v

            Then, -(n · p0) = d.

            D3DX庫提供如下函數來完成通過同一平面上的3個點確定一個平面:

            D3DXPLANE *D3DXPlaneFromPoints(

                   D3DXPLANE* pOut, // Result.

                   CONST D3DXVECTOR3* pV1, // Point 1 on the plane.

                   CONST D3DXVECTOR3* pV2, // Point 2 on the plane.

                   CONST D3DXVECTOR3* pV3 // Point 3 on the plane.

            );

             

            變換平面

            我們能夠通過如下處理來變換一個面(n, d),就象一個4D向量通過乘以它所期望的變換矩陣的逆矩陣一樣來達到變換目的。注意平面的法向量必須首先被標準化。

            我們能用下面的D3DX函數來完成操作:

            D3DXPLANE *D3DXPlaneTransform(

                   D3DXPLANE *pOut, // Result

                   CONST D3DXPLANE *pP, // Input plane.

                   CONST D3DXMATRIX *pM // Transformation matrix.

            );

            示例代碼:

            D3DXMATRIX T(...); // Init. T to a desired transformation.

            D3DXMATRIX inverseOfT;

            D3DXMATRIX inverseTransposeOfT;

            D3DXMatrixInverse( &inverseOfT, 0, &T );

            D3DXMatrixTranspose( &inverseTransposeOfT, &inverseOfT );

            D3DXPLANE p(...); // Init. Plane.

            D3DXPlaneNormalize( &p, &p ); // make sure normal is normalized.

            D3DXPlaneTransform( &p, &p, &inverseTransposeOfT );

             

             

            射線(可選的)

            設想在游戲中的一個玩家,正用他的槍射擊敵人。我們怎么判斷子彈是否從一個位置擊中另一個位置的目標?一個方法是用一條射線模擬子彈,用一個球體模型模擬敵人。(球體模型只是一個球體,它緊緊的圍繞一個物體,從而粗略地表示它的大小。球體模型將在第11章中做更詳細的介紹。)那么通過計算我們就能夠判定是否射中球體。在這部分我們學習射線的數學模型。

            射線

            一條射線能用一個起點和方向來描述。射線的參數方程是:

            線/面相交

            假設一條射線p(t) = p0 + tu 和 一個平面n·p + d = 0,我們想知道射線是否與平面相交,以及相交的交點信息(如果相交的話)。照這樣做,我們把射線代入平面方程并且求滿足平面方程的參數t,解答出來的參數就是相交的點。

            把等式(9)代入平面方程:


            posted on 2008-03-12 14:03 lovedday 閱讀(1463) 評論(0)  編輯 收藏 引用

            公告

            導航

            統計

            常用鏈接

            隨筆分類(178)

            3D游戲編程相關鏈接

            搜索

            最新評論

            一本色道久久综合| 99国产欧美久久久精品蜜芽| 国产亚州精品女人久久久久久 | 久久亚洲私人国产精品| 欧洲人妻丰满av无码久久不卡| 久久精品国产亚洲av高清漫画 | 国产精品9999久久久久| 日韩一区二区久久久久久| 久久中文字幕视频、最近更新| 久久久免费精品re6| 日韩久久无码免费毛片软件 | 国色天香久久久久久久小说| 久久精品国产网红主播| 久久99九九国产免费看小说| 狠狠色丁香久久综合婷婷| 久久久久人妻一区精品| 成人妇女免费播放久久久| 人妻精品久久久久中文字幕| 久久亚洲AV成人出白浆无码国产 | 久久免费国产精品一区二区| 国产亚洲美女精品久久久2020| 久久精品免费观看| 久久香综合精品久久伊人| 99久久国产亚洲综合精品| 精品无码人妻久久久久久| 97精品国产91久久久久久| 久久综合亚洲色HEZYO社区 | 一本一道久久综合狠狠老 | 久久91精品久久91综合| 亚洲香蕉网久久综合影视| 久久夜色精品国产噜噜亚洲a| 久久久久一级精品亚洲国产成人综合AV区 | 狠狠色婷婷综合天天久久丁香| 精品国产青草久久久久福利| 久久久亚洲AV波多野结衣| 久久午夜夜伦鲁鲁片免费无码影视 | 久久久久亚洲av无码专区| 国产成人精品综合久久久| 77777亚洲午夜久久多喷| 伊人久久大香线蕉av不变影院| 无码人妻少妇久久中文字幕蜜桃|