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

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿(1)

            隨筆分類(30)

            隨筆檔案(16)

            文章分類(18)

            文章檔案(9)

            鏈接

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            中文字幕亚洲综合久久2| 午夜欧美精品久久久久久久| 久久99热只有频精品8| 日本人妻丰满熟妇久久久久久| 狠色狠色狠狠色综合久久| 久久久久国产精品三级网| 2021国产精品久久精品| 久久综合中文字幕| 久久久久亚洲AV片无码下载蜜桃| 亚洲色欲久久久综合网东京热| 国产精品美女久久久久AV福利| 久久午夜福利无码1000合集| 天天久久狠狠色综合| 久久精品国产男包| 久久男人AV资源网站| 国产亚洲欧美成人久久片| 欧美激情精品久久久久久久九九九 | 99久久精品午夜一区二区| 久久精品成人影院| 91精品国产高清久久久久久io| 久久99久久成人免费播放| 99999久久久久久亚洲| 久久综合狠狠综合久久| 亚洲国产精品无码久久久久久曰| 久久精品国产亚洲网站| 久久精品无码专区免费东京热| 亚洲国产成人乱码精品女人久久久不卡| 久久综合九色综合网站| 色欲久久久天天天综合网| 国产精品久久久久久久人人看| 久久99国产一区二区三区| 久久国产乱子精品免费女| 日韩AV无码久久一区二区| 久久AV无码精品人妻糸列| 2021国内久久精品| 久久人人爽人人爽人人片av麻烦| 欧美麻豆久久久久久中文| 欧美久久天天综合香蕉伊| 一级A毛片免费观看久久精品| 日批日出水久久亚洲精品tv| 伊色综合久久之综合久久|