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

📄 spheretessellation.cpp

📁 3D Game Engine Design Source Code非常棒
💻 CPP
📖 第 1 页 / 共 2 页
字号:
    rkTetra.m_apkTriangle[3].m_apkEdge[0] = &rkTetra.m_apkEdge[3];
    rkTetra.m_apkTriangle[3].m_apkEdge[1] = &rkTetra.m_apkEdge[5];
    rkTetra.m_apkTriangle[3].m_apkEdge[2] = &rkTetra.m_apkEdge[2];
    rkTetra.m_apkTriangle[3].m_apkAdjacent[0] = &rkTetra.m_apkTriangle[1];
    rkTetra.m_apkTriangle[3].m_apkAdjacent[1] = &rkTetra.m_apkTriangle[2];
    rkTetra.m_apkTriangle[3].m_apkAdjacent[2] = &rkTetra.m_apkTriangle[0];

    // For testing purposes, but not necessary for the algorithm.  This
    // allows the display program to show the subdivision structure.
    for (int i = 0; i < 6; i++)
        rkTetra.m_apkEdge[i].m_iStep = 0;
}
//----------------------------------------------------------------------------
void SphereTessellation::CreateOctahedron (
    QuadricSurfacef::ConvexPolyhedron& rkOct)
{
    rkOct.m_iNumVertices = 6;
    rkOct.m_apkVertex = new QuadricSurfacef::Vertex[6];
    rkOct.m_iNumEdges = 12;
    rkOct.m_apkEdge = new QuadricSurfacef::Edge[12];
    rkOct.m_iNumTriangles = 8;
    rkOct.m_apkTriangle = new QuadricSurfacef::Triangle[8];

    // vertices
    rkOct.m_apkVertex[0].m_pkPoint = new Vector3f;
    rkOct.m_apkVertex[0].m_pkPoint->X() = 0.0f;
    rkOct.m_apkVertex[0].m_pkPoint->Y() = 0.0f;
    rkOct.m_apkVertex[0].m_pkPoint->Z() = 1.0f;
    rkOct.m_apkVertex[0].m_iNumEdges = 4;
    rkOct.m_apkVertex[0].m_apkEdge = new QuadricSurfacef::Edge*[4];
    rkOct.m_apkVertex[0].m_apkEdge[0] = &rkOct.m_apkEdge[0];
    rkOct.m_apkVertex[0].m_apkEdge[1] = &rkOct.m_apkEdge[1];
    rkOct.m_apkVertex[0].m_apkEdge[2] = &rkOct.m_apkEdge[2];
    rkOct.m_apkVertex[0].m_apkEdge[3] = &rkOct.m_apkEdge[3];

    rkOct.m_apkVertex[1].m_pkPoint = new Vector3f;
    rkOct.m_apkVertex[1].m_pkPoint->X() = 1.0f;
    rkOct.m_apkVertex[1].m_pkPoint->Y() = 0.0f;
    rkOct.m_apkVertex[1].m_pkPoint->Z() = 0.0f;
    rkOct.m_apkVertex[1].m_iNumEdges = 4;
    rkOct.m_apkVertex[1].m_apkEdge = new QuadricSurfacef::Edge*[4];
    rkOct.m_apkVertex[1].m_apkEdge[0] = &rkOct.m_apkEdge[0];
    rkOct.m_apkVertex[1].m_apkEdge[1] = &rkOct.m_apkEdge[4];
    rkOct.m_apkVertex[1].m_apkEdge[2] = &rkOct.m_apkEdge[7];
    rkOct.m_apkVertex[1].m_apkEdge[3] = &rkOct.m_apkEdge[8];

    rkOct.m_apkVertex[2].m_pkPoint = new Vector3f;
    rkOct.m_apkVertex[2].m_pkPoint->X() = 0.0f;
    rkOct.m_apkVertex[2].m_pkPoint->Y() = 1.0f;
    rkOct.m_apkVertex[2].m_pkPoint->Z() = 0.0f;
    rkOct.m_apkVertex[2].m_iNumEdges = 4;
    rkOct.m_apkVertex[2].m_apkEdge = new QuadricSurfacef::Edge*[4];
    rkOct.m_apkVertex[2].m_apkEdge[0] = &rkOct.m_apkEdge[1];
    rkOct.m_apkVertex[2].m_apkEdge[1] = &rkOct.m_apkEdge[4];
    rkOct.m_apkVertex[2].m_apkEdge[2] = &rkOct.m_apkEdge[5];
    rkOct.m_apkVertex[2].m_apkEdge[3] = &rkOct.m_apkEdge[9];

    rkOct.m_apkVertex[3].m_pkPoint = new Vector3f;
    rkOct.m_apkVertex[3].m_pkPoint->X() = -1.0f;
    rkOct.m_apkVertex[3].m_pkPoint->Y() = 0.0f;
    rkOct.m_apkVertex[3].m_pkPoint->Z() = 0.0f;
    rkOct.m_apkVertex[3].m_iNumEdges = 4;
    rkOct.m_apkVertex[3].m_apkEdge = new QuadricSurfacef::Edge*[4];
    rkOct.m_apkVertex[3].m_apkEdge[0] = &rkOct.m_apkEdge[2];
    rkOct.m_apkVertex[3].m_apkEdge[1] = &rkOct.m_apkEdge[5];
    rkOct.m_apkVertex[3].m_apkEdge[2] = &rkOct.m_apkEdge[6];
    rkOct.m_apkVertex[3].m_apkEdge[3] = &rkOct.m_apkEdge[10];

    rkOct.m_apkVertex[4].m_pkPoint = new Vector3f;
    rkOct.m_apkVertex[4].m_pkPoint->X() = 0.0f;
    rkOct.m_apkVertex[4].m_pkPoint->Y() = -1.0f;
    rkOct.m_apkVertex[4].m_pkPoint->Z() = 0.0f;
    rkOct.m_apkVertex[4].m_iNumEdges = 4;
    rkOct.m_apkVertex[4].m_apkEdge = new QuadricSurfacef::Edge*[4];
    rkOct.m_apkVertex[4].m_apkEdge[0] = &rkOct.m_apkEdge[3];
    rkOct.m_apkVertex[4].m_apkEdge[1] = &rkOct.m_apkEdge[6];
    rkOct.m_apkVertex[4].m_apkEdge[2] = &rkOct.m_apkEdge[7];
    rkOct.m_apkVertex[4].m_apkEdge[3] = &rkOct.m_apkEdge[11];

    rkOct.m_apkVertex[5].m_pkPoint = new Vector3f;
    rkOct.m_apkVertex[5].m_pkPoint->X() = 0.0f;
    rkOct.m_apkVertex[5].m_pkPoint->Y() = 0.0f;
    rkOct.m_apkVertex[5].m_pkPoint->Z() = -1.0f;
    rkOct.m_apkVertex[5].m_iNumEdges = 4;
    rkOct.m_apkVertex[5].m_apkEdge = new QuadricSurfacef::Edge*[4];
    rkOct.m_apkVertex[5].m_apkEdge[0] = &rkOct.m_apkEdge[8];
    rkOct.m_apkVertex[5].m_apkEdge[1] = &rkOct.m_apkEdge[9];
    rkOct.m_apkVertex[5].m_apkEdge[2] = &rkOct.m_apkEdge[10];
    rkOct.m_apkVertex[5].m_apkEdge[3] = &rkOct.m_apkEdge[11];

    // edges
    rkOct.m_apkEdge[0].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkEdge[0].m_apkVertex[1] = &rkOct.m_apkVertex[1];
    rkOct.m_apkEdge[0].m_apkTriangle[0] = &rkOct.m_apkTriangle[3];
    rkOct.m_apkEdge[0].m_apkTriangle[1] = &rkOct.m_apkTriangle[0];

    rkOct.m_apkEdge[1].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkEdge[1].m_apkVertex[1] = &rkOct.m_apkVertex[2];
    rkOct.m_apkEdge[1].m_apkTriangle[0] = &rkOct.m_apkTriangle[0];
    rkOct.m_apkEdge[1].m_apkTriangle[1] = &rkOct.m_apkTriangle[1];

    rkOct.m_apkEdge[2].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkEdge[2].m_apkVertex[1] = &rkOct.m_apkVertex[3];
    rkOct.m_apkEdge[2].m_apkTriangle[0] = &rkOct.m_apkTriangle[1];
    rkOct.m_apkEdge[2].m_apkTriangle[1] = &rkOct.m_apkTriangle[2];

    rkOct.m_apkEdge[3].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkEdge[3].m_apkVertex[1] = &rkOct.m_apkVertex[4];
    rkOct.m_apkEdge[3].m_apkTriangle[0] = &rkOct.m_apkTriangle[2];
    rkOct.m_apkEdge[3].m_apkTriangle[1] = &rkOct.m_apkTriangle[3];

    rkOct.m_apkEdge[4].m_apkVertex[0] = &rkOct.m_apkVertex[1];
    rkOct.m_apkEdge[4].m_apkVertex[1] = &rkOct.m_apkVertex[2];
    rkOct.m_apkEdge[4].m_apkTriangle[0] = &rkOct.m_apkTriangle[0];
    rkOct.m_apkEdge[4].m_apkTriangle[1] = &rkOct.m_apkTriangle[4];

    rkOct.m_apkEdge[5].m_apkVertex[0] = &rkOct.m_apkVertex[2];
    rkOct.m_apkEdge[5].m_apkVertex[1] = &rkOct.m_apkVertex[3];
    rkOct.m_apkEdge[5].m_apkTriangle[0] = &rkOct.m_apkTriangle[1];
    rkOct.m_apkEdge[5].m_apkTriangle[1] = &rkOct.m_apkTriangle[5];

    rkOct.m_apkEdge[6].m_apkVertex[0] = &rkOct.m_apkVertex[3];
    rkOct.m_apkEdge[6].m_apkVertex[1] = &rkOct.m_apkVertex[4];
    rkOct.m_apkEdge[6].m_apkTriangle[0] = &rkOct.m_apkTriangle[2];
    rkOct.m_apkEdge[6].m_apkTriangle[1] = &rkOct.m_apkTriangle[6];

    rkOct.m_apkEdge[7].m_apkVertex[0] = &rkOct.m_apkVertex[4];
    rkOct.m_apkEdge[7].m_apkVertex[1] = &rkOct.m_apkVertex[1];
    rkOct.m_apkEdge[7].m_apkTriangle[0] = &rkOct.m_apkTriangle[3];
    rkOct.m_apkEdge[7].m_apkTriangle[1] = &rkOct.m_apkTriangle[7];

    rkOct.m_apkEdge[8].m_apkVertex[0] = &rkOct.m_apkVertex[1];
    rkOct.m_apkEdge[8].m_apkVertex[1] = &rkOct.m_apkVertex[5];
    rkOct.m_apkEdge[8].m_apkTriangle[0] = &rkOct.m_apkTriangle[7];
    rkOct.m_apkEdge[8].m_apkTriangle[1] = &rkOct.m_apkTriangle[4];

    rkOct.m_apkEdge[9].m_apkVertex[0] = &rkOct.m_apkVertex[2];
    rkOct.m_apkEdge[9].m_apkVertex[1] = &rkOct.m_apkVertex[5];
    rkOct.m_apkEdge[9].m_apkTriangle[0] = &rkOct.m_apkTriangle[4];
    rkOct.m_apkEdge[9].m_apkTriangle[1] = &rkOct.m_apkTriangle[5];

    rkOct.m_apkEdge[10].m_apkVertex[0] = &rkOct.m_apkVertex[3];
    rkOct.m_apkEdge[10].m_apkVertex[1] = &rkOct.m_apkVertex[5];
    rkOct.m_apkEdge[10].m_apkTriangle[0] = &rkOct.m_apkTriangle[5];
    rkOct.m_apkEdge[10].m_apkTriangle[1] = &rkOct.m_apkTriangle[6];

    rkOct.m_apkEdge[11].m_apkVertex[0] = &rkOct.m_apkVertex[4];
    rkOct.m_apkEdge[11].m_apkVertex[1] = &rkOct.m_apkVertex[5];
    rkOct.m_apkEdge[11].m_apkTriangle[0] = &rkOct.m_apkTriangle[6];
    rkOct.m_apkEdge[11].m_apkTriangle[1] = &rkOct.m_apkTriangle[7];

    // triangles
    rkOct.m_apkTriangle[0].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkTriangle[0].m_apkVertex[1] = &rkOct.m_apkVertex[1];
    rkOct.m_apkTriangle[0].m_apkVertex[2] = &rkOct.m_apkVertex[2];
    rkOct.m_apkTriangle[0].m_apkEdge[0] = &rkOct.m_apkEdge[0];
    rkOct.m_apkTriangle[0].m_apkEdge[1] = &rkOct.m_apkEdge[4];
    rkOct.m_apkTriangle[0].m_apkEdge[2] = &rkOct.m_apkEdge[1];
    rkOct.m_apkTriangle[0].m_apkAdjacent[0] = &rkOct.m_apkTriangle[3];
    rkOct.m_apkTriangle[0].m_apkAdjacent[1] = &rkOct.m_apkTriangle[4];
    rkOct.m_apkTriangle[0].m_apkAdjacent[2] = &rkOct.m_apkTriangle[1];

    rkOct.m_apkTriangle[1].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkTriangle[1].m_apkVertex[1] = &rkOct.m_apkVertex[2];
    rkOct.m_apkTriangle[1].m_apkVertex[2] = &rkOct.m_apkVertex[3];
    rkOct.m_apkTriangle[1].m_apkEdge[0] = &rkOct.m_apkEdge[1];
    rkOct.m_apkTriangle[1].m_apkEdge[1] = &rkOct.m_apkEdge[5];
    rkOct.m_apkTriangle[1].m_apkEdge[2] = &rkOct.m_apkEdge[2];
    rkOct.m_apkTriangle[1].m_apkAdjacent[0] = &rkOct.m_apkTriangle[0];
    rkOct.m_apkTriangle[1].m_apkAdjacent[1] = &rkOct.m_apkTriangle[5];
    rkOct.m_apkTriangle[1].m_apkAdjacent[2] = &rkOct.m_apkTriangle[2];

    rkOct.m_apkTriangle[2].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkTriangle[2].m_apkVertex[1] = &rkOct.m_apkVertex[3];
    rkOct.m_apkTriangle[2].m_apkVertex[2] = &rkOct.m_apkVertex[4];
    rkOct.m_apkTriangle[2].m_apkEdge[0] = &rkOct.m_apkEdge[2];
    rkOct.m_apkTriangle[2].m_apkEdge[1] = &rkOct.m_apkEdge[6];
    rkOct.m_apkTriangle[2].m_apkEdge[2] = &rkOct.m_apkEdge[3];
    rkOct.m_apkTriangle[2].m_apkAdjacent[0] = &rkOct.m_apkTriangle[1];
    rkOct.m_apkTriangle[2].m_apkAdjacent[1] = &rkOct.m_apkTriangle[6];
    rkOct.m_apkTriangle[2].m_apkAdjacent[2] = &rkOct.m_apkTriangle[3];

    rkOct.m_apkTriangle[3].m_apkVertex[0] = &rkOct.m_apkVertex[0];
    rkOct.m_apkTriangle[3].m_apkVertex[1] = &rkOct.m_apkVertex[4];
    rkOct.m_apkTriangle[3].m_apkVertex[2] = &rkOct.m_apkVertex[1];
    rkOct.m_apkTriangle[3].m_apkEdge[0] = &rkOct.m_apkEdge[3];
    rkOct.m_apkTriangle[3].m_apkEdge[1] = &rkOct.m_apkEdge[7];
    rkOct.m_apkTriangle[3].m_apkEdge[2] = &rkOct.m_apkEdge[0];
    rkOct.m_apkTriangle[3].m_apkAdjacent[0] = &rkOct.m_apkTriangle[2];
    rkOct.m_apkTriangle[3].m_apkAdjacent[1] = &rkOct.m_apkTriangle[7];
    rkOct.m_apkTriangle[3].m_apkAdjacent[2] = &rkOct.m_apkTriangle[0];

    rkOct.m_apkTriangle[4].m_apkVertex[0] = &rkOct.m_apkVertex[5];
    rkOct.m_apkTriangle[4].m_apkVertex[1] = &rkOct.m_apkVertex[2];
    rkOct.m_apkTriangle[4].m_apkVertex[2] = &rkOct.m_apkVertex[1];
    rkOct.m_apkTriangle[4].m_apkEdge[0] = &rkOct.m_apkEdge[9];
    rkOct.m_apkTriangle[4].m_apkEdge[1] = &rkOct.m_apkEdge[4];
    rkOct.m_apkTriangle[4].m_apkEdge[2] = &rkOct.m_apkEdge[8];
    rkOct.m_apkTriangle[4].m_apkAdjacent[0] = &rkOct.m_apkTriangle[5];
    rkOct.m_apkTriangle[4].m_apkAdjacent[1] = &rkOct.m_apkTriangle[0];
    rkOct.m_apkTriangle[4].m_apkAdjacent[2] = &rkOct.m_apkTriangle[7];

    rkOct.m_apkTriangle[5].m_apkVertex[0] = &rkOct.m_apkVertex[5];
    rkOct.m_apkTriangle[5].m_apkVertex[1] = &rkOct.m_apkVertex[3];
    rkOct.m_apkTriangle[5].m_apkVertex[2] = &rkOct.m_apkVertex[2];
    rkOct.m_apkTriangle[5].m_apkEdge[0] = &rkOct.m_apkEdge[10];
    rkOct.m_apkTriangle[5].m_apkEdge[1] = &rkOct.m_apkEdge[5];
    rkOct.m_apkTriangle[5].m_apkEdge[2] = &rkOct.m_apkEdge[9];
    rkOct.m_apkTriangle[5].m_apkAdjacent[0] = &rkOct.m_apkTriangle[6];
    rkOct.m_apkTriangle[5].m_apkAdjacent[1] = &rkOct.m_apkTriangle[1];
    rkOct.m_apkTriangle[5].m_apkAdjacent[2] = &rkOct.m_apkTriangle[4];

    rkOct.m_apkTriangle[6].m_apkVertex[0] = &rkOct.m_apkVertex[5];
    rkOct.m_apkTriangle[6].m_apkVertex[1] = &rkOct.m_apkVertex[4];
    rkOct.m_apkTriangle[6].m_apkVertex[2] = &rkOct.m_apkVertex[3];
    rkOct.m_apkTriangle[6].m_apkEdge[0] = &rkOct.m_apkEdge[11];
    rkOct.m_apkTriangle[6].m_apkEdge[1] = &rkOct.m_apkEdge[6];
    rkOct.m_apkTriangle[6].m_apkEdge[2] = &rkOct.m_apkEdge[10];
    rkOct.m_apkTriangle[6].m_apkAdjacent[0] = &rkOct.m_apkTriangle[7];
    rkOct.m_apkTriangle[6].m_apkAdjacent[1] = &rkOct.m_apkTriangle[2];
    rkOct.m_apkTriangle[6].m_apkAdjacent[2] = &rkOct.m_apkTriangle[5];

    rkOct.m_apkTriangle[7].m_apkVertex[0] = &rkOct.m_apkVertex[5];
    rkOct.m_apkTriangle[7].m_apkVertex[1] = &rkOct.m_apkVertex[1];
    rkOct.m_apkTriangle[7].m_apkVertex[2] = &rkOct.m_apkVertex[4];
    rkOct.m_apkTriangle[7].m_apkEdge[0] = &rkOct.m_apkEdge[8];
    rkOct.m_apkTriangle[7].m_apkEdge[1] = &rkOct.m_apkEdge[7];
    rkOct.m_apkTriangle[7].m_apkEdge[2] = &rkOct.m_apkEdge[11];
    rkOct.m_apkTriangle[7].m_apkAdjacent[0] = &rkOct.m_apkTriangle[4];
    rkOct.m_apkTriangle[7].m_apkAdjacent[1] = &rkOct.m_apkTriangle[3];
    rkOct.m_apkTriangle[7].m_apkAdjacent[2] = &rkOct.m_apkTriangle[6];

    // For testing purposes, but not necessary for the algorithm.  This
    // allows the display program to show the subdivision structure.
    for (int i = 0; i < 12; i++)
        rkOct.m_apkEdge[i].m_iStep = 0;
}
//----------------------------------------------------------------------------
void SphereTessellation::ProjectPoint (const Vector3f& rkPoint, int& riX,
    int& riY) const
{
    // projection plane is Dot(eye,(x,y,z)) = -4
    if ( m_bPerspective )
    {
        // perspective projection
        float fT = 8.0f/(4.0f-m_kEye.Dot(rkPoint));
        Vector3f kProj = (1.0f-fT)*m_kEye + fT*rkPoint;
        Vector3f kDir = kProj + m_kEye;
        Vector3f kProd = kDir*m_kRot;

        riX = g_iSize/4 + (int)((g_iSize/8)*(kProd.X() + 2.0f));
        riY = g_iSize/4 + (int)((g_iSize/8)*(kProd.Y() + 2.0f));
    }
    else
    {
        // parallel projection
        Vector3f kDir = rkPoint + m_kEye;
        Vector3f kProd = kDir*m_kRot;

        riX = (int)((g_iSize/4)*(kProd.X() + 2.0f));
        riY = (int)((g_iSize/4)*(kProd.Y() + 2.0f));
    }
}
//----------------------------------------------------------------------------
void SphereTessellation::DrawPolyhedron ()
{
    for (int i = 0; i < m_kPoly.m_iNumEdges; i++)
    {
        const Vector3f* pkP0 = m_kPoly.m_apkEdge[i].m_apkVertex[0]->m_pkPoint;
        int iX0, iY0;
        ProjectPoint(*pkP0,iX0,iY0);

        const Vector3f* pkP1 = m_kPoly.m_apkEdge[i].m_apkVertex[1]->m_pkPoint;
        int iX1, iY1;
        ProjectPoint(*pkP1,iX1,iY1);

        int iIndex = m_kPoly.m_apkEdge[i].m_iStep % 4;
        DrawLine(iX0,iY0,iX1,iY1,ms_akColor[iIndex]);
    }
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

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