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

📄 mgcdistlin3pgm3.cpp

📁 《3D游戏引擎设计》的源码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
                    }
                    fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
                        &fT0);
                    fR0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
            else if ( fS <= 1.0 )
            {
                if ( fT < 0.0 )  // region 7m
                {
                    // min on face t=0 or r=0
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fS);
                    fT = 0.0;
                    fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
                        &fT0);
                    fR0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else if ( fT <= 1.0 )  // region 0m
                {
                    // min on face r=0
                    fSqrDist = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS,
                        &fT);
                    fR = 0.0;
                }
                else  // region 3m
                {
                    // min on face t=1 or r=0
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fS);
                    fT = 1.0;
                    fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
                        &fT0);
                    fR0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
            else
            {
                if ( fT < 0.0 )  // region 8m
                {
                    // min on face s=1 or t=0 or r=0
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fT);
                    fS = 1.0;
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fS0);
                    fT0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                    fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
                        &fT0);
                    fR0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else if ( fT <= 1.0 )  // region 1m
                {
                    // min on face s=1 or r=0
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fT);
                    fS = 1.0;
                    fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
                        &fT0);
                    fR0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else  // region 2m
                {
                    // min on face s=1 or t=1 or r=0
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fT);
                    fS = 1.0;
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fS0);
                    fT0 = 1.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                    fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,
                        &fT0);
                    fR0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fR = fR0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
        }
        else  // fR > 0.0
        {
            if ( fS < 0.0 )
            {
                if ( fT < 0.0 )  // region 6p
                {
                    // min on face s=0 or t=0
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
                    fS = 0.0;
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
                    fT0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else if ( fT <= 1.0 )  // region 5p
                {
                    // min on face s=0
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
                    fS = 0.0;
                }
                else  // region 4p
                {
                    // min on face s=0 or t=1
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
                    fS = 0.0;
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
                    fT0 = 1.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
            else if ( fS <= 1.0 )
            {
                if ( fT < 0.0 )  // region 7p
                {
                    // min on face t=0
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fS);
                    fT = 0.0;
                }
                else if ( fT <= 1.0 )  // region 0p
                {
                    // ray intersects the parallelogram
                    fSqrDist = 0.0;
                }
                else  // region 3p
                {
                    // min on face t=1
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fS);
                    fT = 1.0;
                }
            }
            else
            {
                if ( fT < 0.0 )  // region 8p
                {
                    // min on face s=1 or t=0
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
                    fS = 1.0;
                    kSegPgm.Origin() = rkPgm.Origin();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
                    fT0 = 0.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
                else if ( fT <= 1.0 )  // region 1p
                {
                    // min on face s=1
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
                    fS = 1.0;
                }
                else  // region 2p
                {
                    // min on face s=1 or t=1
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
                    kSegPgm.Direction() = rkPgm.Edge1();
                    fSqrDist = MgcSqrDistance(rkRay,kSegPgm,0,&fT);
                    fS = 1.0;
                    kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
                    kSegPgm.Direction() = rkPgm.Edge0();
                    fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,0,&fS0);
                    fT0 = 1.0;
                    if ( fSqrDist0 < fSqrDist )
                    {
                        fSqrDist = fSqrDist0;
                        fS = fS0;
                        fT = fT0;
                    }
                }
            }
        }
    }
    else
    {
        // ray and parallelogram are parallel
        kSegPgm.Origin() = rkPgm.Origin();
        kSegPgm.Direction() = rkPgm.Edge0();
        fSqrDist = MgcSqrDistance(rkRay,kSegPgm,&fR,&fS);
        fT = 0.0;

        kSegPgm.Direction() = rkPgm.Edge1();
        fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fT0);
        fS0 = 0.0;
        if ( fSqrDist0 < fSqrDist )
        {
            fSqrDist = fSqrDist0;
            fR = fR0;
            fS = fS0;
            fT = fT0;
        }

        kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge1();
        kSegPgm.Direction() = rkPgm.Edge0();
        fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fS0);
        fT0 = 1.0;
        if ( fSqrDist0 < fSqrDist )
        {
            fSqrDist = fSqrDist0;
            fR = fR0;
            fS = fS0;
            fT = fT0;
        }

        kSegPgm.Origin() = rkPgm.Origin()+rkPgm.Edge0();
        kSegPgm.Direction() = rkPgm.Edge1();
        fSqrDist0 = MgcSqrDistance(rkRay,kSegPgm,&fR0,&fT0);
        fS0 = 1.0;
        if ( fSqrDist0 < fSqrDist )
        {
            fSqrDist = fSqrDist0;
            fR = fR0;
            fS = fS0;
            fT = fT0;
        }

        fSqrDist0 = MgcSqrDistance(rkRay.Origin(),rkPgm,&fS0,&fT0);
        fR0 = 0.0;
        if ( fSqrDist0 < fSqrDist )
        {
            fSqrDist = fSqrDist0;
            fR = fR0;
            fS = fS0;
            fT = fT0;
        }
    }

    if ( pfRayP )
        *pfRayP = fR;

    if ( pfPgmP0 )
        *pfPgmP0 = fS;

    if ( pfPgmP1 )
        *pfPgmP1 = fT;

    return MgcMath::Abs(fSqrDist);
}
//----------------------------------------------------------------------------
MgcReal MgcSqrDistance (const MgcSegment3& rkSeg,
    const MgcParallelogram3& rkPgm, MgcReal* pfSegP, MgcReal* pfPgmP0,
    MgcReal* pfPgmP1)
{    MgcVector3 kDiff = rkPgm.Origin() - rkSeg.Origin();    MgcReal fA00 = rkSeg.Direction().SquaredLength();    MgcReal fA01 = -rkSeg.Direction().Dot(rkPgm.Edge0());    MgcReal fA02 = -rkSeg.Direction().Dot(rkPgm.Edge1());    MgcReal fA11 = rkPgm.Edge0().SquaredLength();

⌨️ 快捷键说明

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