• <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 隨便寫寫 閱讀(2867) 評論(0)  編輯 收藏 引用 所屬分類: 圖形學

            導航

            <2007年9月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            30123456

            統計

            常用鏈接

            留言簿(1)

            隨筆分類(30)

            隨筆檔案(16)

            文章分類(18)

            文章檔案(9)

            鏈接

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品成人欧美大片| 日韩精品久久无码人妻中文字幕| 久久久久久精品免费看SSS| 亚洲中文字幕伊人久久无码| 狠狠综合久久AV一区二区三区| 久久亚洲精精品中文字幕| 国产美女久久久| 久久这里都是精品| 99久久国产亚洲高清观看2024 | 欧美精品国产综合久久| 久久一日本道色综合久久| 青青国产成人久久91网| 伊人久久大香线蕉综合5g| 国产一级做a爰片久久毛片| 三级韩国一区久久二区综合| 成人妇女免费播放久久久| 久久人人爽人人爽AV片| 国产成人无码久久久精品一| 伊人热热久久原色播放www| 91精品国产色综久久| 成人综合伊人五月婷久久| 国产欧美久久久精品影院| 久久99精品久久久久久9蜜桃| 国产成人无码精品久久久性色| 久久久亚洲精品蜜桃臀| 99久久伊人精品综合观看| 久久国产精品-久久精品| 亚洲精品乱码久久久久久中文字幕| 久久久精品日本一区二区三区| 久久亚洲精品成人av无码网站| 久久久久亚洲av综合波多野结衣| 久久久久久国产精品免费免费| 香蕉久久夜色精品国产小说| 国内精品久久久久久野外| 国内精品伊人久久久久av一坑| 亚洲AV无码一区东京热久久| 久久久噜噜噜久久中文字幕色伊伊| 久久久久亚洲AV成人网人人软件| 久久99国产精品成人欧美| 国产精品青草久久久久福利99| 大香网伊人久久综合网2020|