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

📄 mgcgpcamera.txt

📁 《3D游戏引擎设计》的源码
💻 TXT
字号:
header file
    //*** used by renderers
    void ComputeModelToViewTransform (const MgcMatrix3& rkWorldRotate,
        const MgcVector3& rkWorldTranslate, MgcReal fWorldScale,
        MgcMatrix3& rkMatrix, MgcVector3& rkTranslate) const;

    MgcReal GetFarDivideNear () const;
    MgcReal GetFarDivideFarMinusNear () const;
    //***

    MgcReal m_fInverseNear;            // 1/N
    MgcReal m_fFarDivideNear;          // F/N
    MgcReal m_fFarDivideFarMinusNear;  // F/(F-N)
    MgcReal m_fNearDivideFar;          // N/F
    MgcReal m_fTwoDivRmL;              // 2/(R-L)
    MgcReal m_fTwoDivTmB;              // 2/(T-B)
    MgcReal m_fRpLDivNRmL;              // (R+L)/((R-L)*N)
    MgcReal m_fTpBDivNTmB;              // (T+B)/((T-B)*N)
    void UpdateFrustumData ();
    MgcReal GetNearDivideFar () const;

    // camera projetion-times-view matrix
    MgcMatrix3 m_kProjViewMat;
    MgcVector3 m_kProjViewTrn;

source file

//---------------------------------------------------------------------------
void MgcCamera::UpdateFrustumData ()
{
    m_fInverseNear = 1.0/m_fNear;
    m_fFarDivideNear = m_fFar*m_fInverseNear;
    m_fFarDivideFarMinusNear = m_fFar/(m_fFar-m_fNear);
    m_fNearDivideFar = m_fNear/m_fFar;
    m_fTwoDivRmL = 2.0/(m_fRight-m_fLeft);
    m_fRpLDivNRmL = ((m_fRight+m_fLeft)/(m_fRight-m_fLeft))*m_fInverseNear;
    m_fTwoDivTmB = 2.0/(m_fTop-m_fBottom);
    m_fTpBDivNTmB = ((m_fTop+m_fBottom)/(m_fTop-m_fBottom))*m_fInverseNear;
}
//---------------------------------------------------------------------------
void MgcCamera::ComputeModelToViewTransform (const MgcMatrix3& rkWorldRotate,
    const MgcVector3& rkWorldTranslate, MgcReal fWorldScale,
    MgcMatrix3& rkMatrix, MgcVector3& rkTranslate) const
{
    MgcMatrix3 kMat
    (
        m_fTwoDivRmL*m_kLeft[0] - m_fRpLDivNRmL*m_kDirection[0],
        m_fTwoDivRmL*m_kLeft[1] - m_fRpLDivNRmL*m_kDirection[1],
        m_fTwoDivRmL*m_kLeft[2] - m_fRpLDivNRmL*m_kDirection[2],
        m_fTwoDivTmB*m_kUp[0] - m_fTpBDivNTmB*m_kDirection[0],
        m_fTwoDivTmB*m_kUp[1] - m_fTpBDivNTmB*m_kDirection[1],
        m_fTwoDivTmB*m_kUp[2] - m_fTpBDivNTmB*m_kDirection[2],
        m_fInverseNear*m_kDirection[0],
        m_fInverseNear*m_kDirection[1],
        m_fInverseNear*m_kDirection[2]
    );

    rkTranslate = kMat*(rkWorldTranslate - m_kLocation);
    rkMatrix = fWorldScale*(kMat*rkWorldRotate);
}
//---------------------------------------------------------------------------
MgcReal MgcCamera::GetFarDivideNear () const
{
    return m_fFarDivideNear;
}
//---------------------------------------------------------------------------
MgcReal MgcCamera::GetFarDivideFarMinusNear () const
{
    return m_fFarDivideFarMinusNear;
}
//---------------------------------------------------------------------------
MgcReal MgcCamera::GetNearDivideFar () const
{
    return m_fNearDivideFar;
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

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