⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgcbeziertriangle3g.cpp

📁 《3D游戏引擎设计》的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        akXu[uiI01] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI1] -
            fDSqr*rkBP.m_kXuuu);
        akXv[uiI01] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI1] -
            fDSqr*rkBP.m_kXuuv);

        // left v-edge subdivision
        akXu[uiI02] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXuvv);
        akXv[uiI02] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXvvv);

        // hypotenuse edge subdivision
        akXu[uiI12] = 0.5*(akXu[rkBP.m_uiI1] + akXu[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXhhu);
        akXv[uiI12] = 0.5*(akXv[rkBP.m_uiI1] + akXv[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXhhv);
    }

    // recurse on four children
    if ( uiLevel > 0 )
    {
        uiLevel--;
        fDSqr *= 0.25;

        BlockParameters kSubBP;

        // subtriangle <(s0,t0),(sm,t0),(s0,tm)>
        kSubBP.m_uiI0 = rkBP.m_uiI0;
        kSubBP.m_uiI1 = uiI01;
        kSubBP.m_uiI2 = uiI02;
        kSubBP.m_aakXuu[0] = rkBP.m_aakXuu[0];
        kSubBP.m_aakXuu[1] = kXuu01;
        kSubBP.m_aakXuu[2] = kXuu02;
        kSubBP.m_aakXvv[0] = rkBP.m_aakXvv[0];
        kSubBP.m_aakXvv[1] = kXvv01;
        kSubBP.m_aakXvv[2] = kXvv02;
        kSubBP.m_aakXhh[0] = rkBP.m_aakXhh[0];
        kSubBP.m_aakXhh[1] = kXhh01;
        kSubBP.m_aakXhh[2] = kXhh02;

        SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subtriangle <(sm,t0),(s1,t0),(sm,tm)>
        kSubBP.m_uiI0 = uiI01;
        kSubBP.m_uiI1 = rkBP.m_uiI1;
        kSubBP.m_uiI2 = uiI12;
        kSubBP.m_aakXuu[0] = kXuu01;
        kSubBP.m_aakXuu[1] = rkBP.m_aakXuu[1];
        kSubBP.m_aakXuu[2] = kXuu12;
        kSubBP.m_aakXvv[0] = kXvv01;
        kSubBP.m_aakXvv[1] = rkBP.m_aakXvv[1];
        kSubBP.m_aakXvv[2] = kXvv12;
        kSubBP.m_aakXhh[0] = kXhh01;
        kSubBP.m_aakXhh[1] = rkBP.m_aakXhh[1];
        kSubBP.m_aakXhh[2] = kXhh12;

        SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subtriangle <(s0,tm),(sm,tm),(s0,t1)>
        kSubBP.m_uiI0 = uiI02;
        kSubBP.m_uiI1 = uiI12;
        kSubBP.m_uiI2 = rkBP.m_uiI2;
        kSubBP.m_aakXuu[0] = kXuu02;
        kSubBP.m_aakXuu[1] = kXuu12;
        kSubBP.m_aakXuu[2] = rkBP.m_aakXuu[2];
        kSubBP.m_aakXvv[0] = kXvv02;
        kSubBP.m_aakXvv[1] = kXvv12;
        kSubBP.m_aakXvv[2] = rkBP.m_aakXvv[2];
        kSubBP.m_aakXhh[0] = kXhh02;
        kSubBP.m_aakXhh[1] = kXhh12;
        kSubBP.m_aakXhh[2] = rkBP.m_aakXhh[2];

        SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subtriangle <(sm,t0),(sm,tm),(s0,tm)>
        kSubBP.m_uiI0 = uiI01;
        kSubBP.m_uiI1 = uiI12;
        kSubBP.m_uiI2 = uiI02;
        kSubBP.m_aakXuu[0] = kXuu01;
        kSubBP.m_aakXuu[1] = kXuu12;
        kSubBP.m_aakXuu[2] = kXuu02;
        kSubBP.m_aakXvv[0] = kXvv01;
        kSubBP.m_aakXvv[1] = kXvv12;
        kSubBP.m_aakXvv[2] = kXvv02;
        kSubBP.m_aakXhh[0] = kXhh01;
        kSubBP.m_aakXhh[1] = kXhh12;
        kSubBP.m_aakXhh[2] = kXhh02;

        SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
    }
}
//----------------------------------------------------------------------------
void MgcBezierTriangle3G::SubdivideUR (unsigned int uiLevel, MgcReal fDSqr,
    MgcVector3* akX, MgcVector3* akXu, MgcVector3* akXv,
    BlockParameters& rkBP)
{
    /*
     i2   i1
     +----+
       \  |
         \|
          +
          i0
    */

    // subdivision indices
    unsigned int uiI12 = (rkBP.m_uiI1 + rkBP.m_uiI2) >> 1;
    unsigned int uiD12 = rkBP.m_uiI1 - rkBP.m_uiI2;
    unsigned int uiI01 = (((rkBP.m_uiI0+rkBP.m_uiI1) << 2)+uiD12*uiD12) >> 3;
    unsigned int uiI02 = uiI01 - (uiD12 >> 1);

    // vertices

    // top u-edge subdivision
    MgcVector3 kXuu12 = 0.5*(rkBP.m_aakXuu[1] + rkBP.m_aakXuu[2]);
    MgcVector3 kXvv12 = 0.5*(rkBP.m_aakXvv[1] + rkBP.m_aakXvv[2]);
    MgcVector3 kXhh12 = 0.5*(rkBP.m_aakXhh[1] + rkBP.m_aakXhh[2]);
    akX[uiI12] = 0.5*(akX[rkBP.m_uiI1] + akX[rkBP.m_uiI2] - fDSqr*kXuu12);

    // right v-edge subdivision
    MgcVector3 kXuu01 = 0.5*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[1]);
    MgcVector3 kXvv01 = 0.5*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[1]);
    MgcVector3 kXhh01 = 0.5*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[1]);
    akX[uiI01] = 0.5*(akX[rkBP.m_uiI0] + akX[rkBP.m_uiI1] - fDSqr*kXvv01);

    // hypotenuse edge subdivision
    MgcVector3 kXuu02 = 0.5*(rkBP.m_aakXuu[0] + rkBP.m_aakXuu[2]);
    MgcVector3 kXvv02 = 0.5*(rkBP.m_aakXvv[0] + rkBP.m_aakXvv[2]);
    MgcVector3 kXhh02 = 0.5*(rkBP.m_aakXhh[0] + rkBP.m_aakXhh[2]);
    akX[uiI02] = 0.5*(akX[rkBP.m_uiI0] + akX[rkBP.m_uiI2] - fDSqr*kXhh02);

    // derivatives (for normal vectors)
    if ( akXu )
    {
        // top u-edge subdivision
        akXu[uiI12] = 0.5*(akXu[rkBP.m_uiI1] + akXu[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXuuu);
        akXv[uiI12] = 0.5*(akXv[rkBP.m_uiI1] + akXv[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXuuv);

        // right v-edge subdivision
        akXu[uiI01] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI1] - 
            fDSqr*rkBP.m_kXuvv);
        akXv[uiI01] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI1] -
            fDSqr*rkBP.m_kXvvv);

        // hypotenuse edge subdivision
        akXu[uiI02] = 0.5*(akXu[rkBP.m_uiI0] + akXu[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXhhu);
        akXv[uiI02] = 0.5*(akXv[rkBP.m_uiI0] + akXv[rkBP.m_uiI2] -
            fDSqr*rkBP.m_kXhhv);
    }

    // recurse on four children
    if ( uiLevel > 0 )
    {
        uiLevel--;
        fDSqr *= 0.25;

        BlockParameters kSubBP;

        // subtriangle <(sm,tm),(sm,t1),(s0,t1)>
        kSubBP.m_uiI0 = uiI02;
        kSubBP.m_uiI1 = uiI12;
        kSubBP.m_uiI2 = rkBP.m_uiI2;
        kSubBP.m_aakXuu[0] = kXuu02;
        kSubBP.m_aakXuu[1] = kXuu12;
        kSubBP.m_aakXuu[2] = rkBP.m_aakXuu[2];
        kSubBP.m_aakXvv[0] = kXvv02;
        kSubBP.m_aakXvv[1] = kXvv12;
        kSubBP.m_aakXvv[2] = rkBP.m_aakXvv[2];
        kSubBP.m_aakXhh[0] = kXhh02;
        kSubBP.m_aakXhh[1] = kXhh12;
        kSubBP.m_aakXhh[2] = rkBP.m_aakXhh[2];

        SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subtriangle <(s1,tm),(s1,t1),(sm,t1)>
        kSubBP.m_uiI0 = uiI01;
        kSubBP.m_uiI1 = rkBP.m_uiI1;
        kSubBP.m_uiI2 = uiI12;
        kSubBP.m_aakXuu[0] = kXuu01;
        kSubBP.m_aakXuu[1] = rkBP.m_aakXuu[1];
        kSubBP.m_aakXuu[2] = kXuu12;
        kSubBP.m_aakXvv[0] = kXvv01;
        kSubBP.m_aakXvv[1] = rkBP.m_aakXvv[1];
        kSubBP.m_aakXvv[2] = kXvv12;
        kSubBP.m_aakXhh[0] = kXhh01;
        kSubBP.m_aakXhh[1] = rkBP.m_aakXhh[1];
        kSubBP.m_aakXhh[2] = kXhh12;

        SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subtriangle <(s1,t0),(s1,tm),(sm,tm)>
        kSubBP.m_uiI0 = rkBP.m_uiI0;
        kSubBP.m_uiI1 = uiI01;
        kSubBP.m_uiI2 = uiI02;
        kSubBP.m_aakXuu[0] = rkBP.m_aakXuu[0];
        kSubBP.m_aakXuu[1] = kXuu01;
        kSubBP.m_aakXuu[2] = kXuu02;
        kSubBP.m_aakXvv[0] = rkBP.m_aakXvv[0];
        kSubBP.m_aakXvv[1] = kXvv01;
        kSubBP.m_aakXvv[2] = kXvv02;
        kSubBP.m_aakXhh[0] = rkBP.m_aakXhh[0];
        kSubBP.m_aakXhh[1] = kXhh01;
        kSubBP.m_aakXhh[2] = kXhh02;

        SubdivideUR(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);

        // subtriangle <(sm,tm),(s1,tm),(sm,t1)>
        kSubBP.m_uiI0 = uiI02;
        kSubBP.m_uiI1 = uiI01;
        kSubBP.m_uiI2 = uiI12;
        kSubBP.m_aakXuu[0] = kXuu02;
        kSubBP.m_aakXuu[1] = kXuu01;
        kSubBP.m_aakXuu[2] = kXuu12;
        kSubBP.m_aakXvv[0] = kXvv02;
        kSubBP.m_aakXvv[1] = kXvv01;
        kSubBP.m_aakXvv[2] = kXvv12;
        kSubBP.m_aakXhh[0] = kXhh02;
        kSubBP.m_aakXhh[1] = kXhh01;
        kSubBP.m_aakXhh[2] = kXhh12;

        SubdivideLL(uiLevel,fDSqr,akX,akXu,akXv,kSubBP);
    }
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -