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

            副法線和正切是什么?

            法線,切線和副法線構成了所謂的切線空間(tangnet space),在Bump Mapping中,法線紋理中存儲的法線值就是在切線空間內的。

            從網上找了一段求切線和副法線的代碼.
            根據三個頂點的位置坐標和紋理坐標求面的副法線和正切
             1//let P = v1 - v0
             2D3DXVECTOR3 P = v1.pos - v0.pos;
             3//let Q = v2 - v0
             4D3DXVECTOR3 Q = v2.pos - v0.pos;
             5float s1 = v1.s - v0.s;
             6float t1 = v1.t - v0.t;
             7float s2 = v2.s - v0.s;
             8float t2 = v2.t - v0.t; 
             9
            10//we need to solve the equation
            11// P = s1*T + t1*B
            12// Q = s2*T + t2*B
            13// for T and B
            14
            15
            16//this is a linear system with six unknowns and six equatinos, for TxTyTz BxByBz
            17//[px,py,pz] = [s1,t1] * [Tx,Ty,Tz]
            18// qx,qy,qz     s2,t2     Bx,By,Bz
            19
            20//multiplying both sides by the inverse of the s,t matrix gives
            21//[Tx,Ty,Tz] = 1/(s1t2-s2t1) *  [t2,-t1] * [px,py,pz]
            22// Bx,By,Bz                      -s2,s1     qx,qy,qz  
            23
            24//solve this for the unormalized T and B to get from tangent to object space
            25
            26
            27float tmp = 0.0f;
            28if(fabsf(s1*t2 - s2*t1) <= 0.0001f)
            29{
            30    tmp = 1.0f;
            31}

            32else
            33{
            34    tmp = 1.0f/(s1*t2 - s2*t1 );
            35}

            36
            37tangent.x = (t2*P.x - t1*Q.x);
            38tangent.y = (t2*P.y - t1*Q.y);
            39tangent.z  = (t2*P.z - t1*Q.z);
            40
            41tangent = tmp * tangent;
            42
            43binormal.x = (s1*Q.x - s2*P.x);
            44binormal.y = (s1*Q.y - s2*P.y);
            45binormal.z = (s1*Q.z - s2*P.z);
            46
            47binormal = tmp * binormal;

            根據Maya里面的資料寫了一個求取tangent的函數,輸入為3個頂點的位置,法線和紋理坐標,輸出是切線值,副法線可以由切線和法線叉乘得到。
            inline bool floatEqual(float a, float b)
            {
                
            return abs(a-b) < 0.00001f;
            }


            HRESULT ComputerTangent(D3DXVECTOR3 position[
            3], D3DXVECTOR3 normal[3], D3DXVECTOR2 texcoord[3],D3DXVECTOR3 oTangent[3])
            {
                D3DXVECTOR3 edge1;
                D3DXVECTOR3 edge2;
                D3DXVECTOR3 crossP;

                 
            //==============================================
                
            // x, s, t
                
            // S & T vectors get used several times in this vector,
                
            // but are only computed once.
                
            //==============================================
                edge1.x = position[1].x - position[0].x;
                edge1.y 
            = texcoord[1].x - texcoord[0].x;// s-vector - don't need to compute this multiple times
                edge1.z = texcoord[1].y - texcoord[0].y;// t-vector

                edge2.x 
            = position[2].x - position[0].x;
                edge2.y 
            = texcoord[2].x - texcoord[0].x;// another s-vector
                edge2.z = texcoord[2].y - texcoord[0].y;// another t-vector

                D3DXVec3Cross(
            &crossP,&edge1,&edge2);
                D3DXVec3Normalize(
            &crossP,&crossP);

                
            bool degnerateUVTangentPlane = floatEqual(crossP.x, 0.0f);
                
            if(degnerateUVTangentPlane)
                    crossP.x 
            = 1.0f;

                
            float tanX = -crossP.y / crossP.x;

                oTangent[
            0].x = tanX;
                oTangent[
            1].x = tanX;
                oTangent[
            2].x = tanX;

                
            //--------------------------------------------------------
                
            // y, s, t
                
            //--------------------------------------------------------
                edge1.x = position[1].y - position[0].y;

                edge2.x 
            = position[2].y - position[0].y;
                edge2.y 
            = texcoord[2].x - texcoord[0].x;// another s-vector
                edge2.z = texcoord[2].y - texcoord[0].y;// another t-vector

                D3DXVec3Cross(
            &crossP,&edge1,&edge2);
                D3DXVec3Normalize(
            &crossP,&crossP);

                degnerateUVTangentPlane 
            = floatEqual(crossP.x, 0.0f);
                
            if(degnerateUVTangentPlane)
                    crossP.x 
            = 1.0f;

                
            float tanY = -crossP.y / crossP.x;

                oTangent[
            0].y = tanY;
                oTangent[
            1].y = tanY;
                oTangent[
            2].y = tanY;

                 
            //------------------------------------------------------
                
            // z, s, t
                
            //------------------------------------------------------
                edge1.x = position[1].z - position[0].z;

                edge2.x 
            = position[2].z - position[0].z;
                edge2.y 
            = texcoord[2].x - texcoord[0].x;// another s-vector
                edge2.z = texcoord[2].y - texcoord[0].y;// another t-vector

                D3DXVec3Cross(
            &crossP,&edge1,&edge2);
                D3DXVec3Normalize(
            &crossP,&crossP);

                degnerateUVTangentPlane 
            = floatEqual(crossP.x, 0.0f);
                
            if(degnerateUVTangentPlane)
                    crossP.x 
            = 1.0f;

                
            float tanZ = -crossP.y / crossP.x;

                oTangent[
            0].z = tanZ;
                oTangent[
            1].z = tanZ;
                oTangent[
            2].z = tanZ;

                
            //------------------------------------------------------
                forint i = 0; i < 3; i++)
                
            {
                    
            // Ortho-normalize to normal
                    float dot = D3DXVec3Dot(&oTangent[i],&normal[i]);
                    oTangent[i] 
            -= normal[i] * dot;

                    
            // Normalize tangents
                    D3DXVec3Normalize(&oTangent[i],&oTangent[i]);
                }


                
            return S_OK;
            }

            posted on 2007-06-11 16:09 隨便寫寫 閱讀(2866) 評論(0)  編輯 收藏 引用 所屬分類: 圖形學

            導航

            <2007年6月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            統計

            常用鏈接

            留言簿(1)

            隨筆分類(30)

            隨筆檔案(16)

            文章分類(18)

            文章檔案(9)

            鏈接

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            日本欧美国产精品第一页久久| 久久久99精品成人片中文字幕| 中文成人无码精品久久久不卡 | 久久精品国产精品亚洲毛片 | 亚洲精品第一综合99久久| 国产精品免费久久久久久久久| 国产精品狼人久久久久影院| 无码人妻久久一区二区三区蜜桃| 2021国产精品久久精品| 国产成人精品久久二区二区| 国产精品成人99久久久久| 区久久AAA片69亚洲| 51久久夜色精品国产| 久久久无码精品亚洲日韩京东传媒 | 伊人色综合久久| 精品久久人人爽天天玩人人妻| 精品一区二区久久| 伊人久久成人成综合网222| 99麻豆久久久国产精品免费| 狠狠色丁香久久婷婷综合图片| 999久久久国产精品| 日韩人妻无码精品久久免费一| 人妻丰满?V无码久久不卡| 久久精品国内一区二区三区| 久久丫精品国产亚洲av不卡 | 伊人久久无码中文字幕| 国产精品gz久久久| 97久久国产亚洲精品超碰热| 精品久久人人爽天天玩人人妻| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 噜噜噜色噜噜噜久久| 精品国产一区二区三区久久蜜臀| 日韩精品久久久肉伦网站 | 久久香蕉国产线看观看乱码| 亚洲国产另类久久久精品小说 | 色综合久久中文综合网| 久久精品水蜜桃av综合天堂 | 色综合久久久久综合体桃花网| 久久最新免费视频| 久久久久国色AV免费观看| 精品无码久久久久久久动漫|