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

            副法線和正切是什么?

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

            從網(wǎng)上找了一段求切線和副法線的代碼.
            根據(jù)三個頂點的位置坐標(biāo)和紋理坐標(biāo)求面的副法線和正切
             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;

            根據(jù)Maya里面的資料寫了一個求取tangent的函數(shù),輸入為3個頂點的位置,法線和紋理坐標(biāo),輸出是切線值,副法線可以由切線和法線叉乘得到。
            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 隨便寫寫 閱讀(2878) 評論(0)  編輯 收藏 引用 所屬分類: 圖形學(xué)

            導(dǎo)航

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類(30)

            隨筆檔案(16)

            文章分類(18)

            文章檔案(9)

            鏈接

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品成人国产午夜| 免费精品久久天干天干| 久久亚洲国产精品一区二区| 久久综合久久综合久久| 伊人久久五月天| 久久国产精品无码一区二区三区 | 日本免费一区二区久久人人澡| 久久久网中文字幕| 狠狠色丁香久久婷婷综合五月| 久久精品无码一区二区日韩AV| 性高湖久久久久久久久| 亚洲日本va午夜中文字幕久久| 99精品久久久久中文字幕| 久久无码高潮喷水| 久久久久亚洲精品天堂久久久久久 | 亚洲国产综合久久天堂| 久久精品国产亚洲综合色| 亚洲va中文字幕无码久久| 欧美一级久久久久久久大| 久久青青草原精品影院| 久久精品国产亚洲av日韩 | 亚洲αv久久久噜噜噜噜噜| 久久男人AV资源网站| 大香网伊人久久综合网2020| 国产V综合V亚洲欧美久久| 亚洲欧美成人综合久久久 | 国产精品伊人久久伊人电影 | MM131亚洲国产美女久久| 久久免费的精品国产V∧| 久久亚洲精品国产精品| 久久天天躁狠狠躁夜夜躁2O2O| 狠狠精品久久久无码中文字幕| 国产精品99久久久久久宅男小说| 欧美国产成人久久精品| 亚洲乱码日产精品a级毛片久久 | 国产美女久久精品香蕉69| 久久精品国产第一区二区三区 | 久久久久久久综合狠狠综合| 亚洲成av人片不卡无码久久 | 无码8090精品久久一区| 热久久视久久精品18|