OpenGL Super Bible 第四章 Transform 程序绘图部分代码解析

 

void DrawTorus(M3DMatrix44f mTransform)
    {
    // 大圆只存在于 xy 平面,
    // 小圆存在于 xyz 空间中,
    // 其圆心是大圆圆周上的点。
    // 小圆环大圆半径方向为起始旋转一周形成的。
    // 由于 z 轴垂直于 xy 平面,
    // 又因为大圆的半径位于 xy 平面,
    // 因此,z 轴垂直于大圆的半径(垂直于面,垂直于线),
    // 因此,z 轴与大圆的半径方向是正交的。
    // 小圆位于 z 轴与大圆半径方向形成的平面,
    // 后面计算具体点的位置是基于上面的描述。
    
    // 大圆半径
    GLfloat majorRadius = 0.35f;
    // 小圆半径
    GLfloat minorRadius = 0.15f;
    // 大圆圆周被切分的点数
    GLint   numMajor = 40;
    // 小圆圆周被切分的点数
    GLint   numMinor = 20;
    M3DVector3f objectVertex;         // Vertex in object/eye space
    M3DVector3f transformedVertex;    // New Transformed vertex
    // 每个点对应的弧度数
    double majorStep = 2.0f*M3D_PI / numMajor;
    double minorStep = 2.0f*M3D_PI / numMinor;
    int i, j;
    
    // 对于大圆上的点进行迭代
    for (i=0; i// 第一个点对应的弧度
        double a0 = i * majorStep;
        // 第二个点对应的弧度
        double a1 = a0 + majorStep;
        // 第一个点在 x 与 y 轴上的单位长度
        GLfloat x0 = (GLfloat) cos(a0);
        GLfloat y0 = (GLfloat) sin(a0);
        // 第二个点在 x 与 y 轴上的单位长度
        GLfloat x1 = (GLfloat) cos(a1);
        GLfloat y1 = (GLfloat) sin(a1);

        glBegin(GL_TRIANGLE_STRIP);
        // 对小圆上的点进行迭代
        for (j=0; j<=numMinor; ++j) 
            {
            // 小圆上点对应的弧度
            double b = j * minorStep;
            // 小圆上点在半径方向的单位长度
            GLfloat c = (GLfloat) cos(b);
            // 小圆上点,在xy 平面的分量长度
            GLfloat r = minorRadius * c + majorRadius;
            // 小圆上点在 z 轴上的长度
            GLfloat z = minorRadius * (GLfloat) sin(b);
            
            // 小圆上点坐标确认的过程:将该点分为在 z 轴 与 大圆半径方向,由于大圆半径只存在于 xy 平面,就相对容易求到 x , y 坐标。
            
            // First point
            objectVertex[0] = x0*r;// 小圆上点对应的 x 坐标
            objectVertex[1] = y0*r;// 小圆上点对应的 y 坐标
            objectVertex[2] = z; // 小圆上点对应的 z 坐标
            m3dTransformVector3(transformedVertex, objectVertex, mTransform);
            glVertex3fv(transformedVertex);

            // Second point
            objectVertex[0] = x1*r;
            objectVertex[1] = y1*r;
            objectVertex[2] = z;
            m3dTransformVector3(transformedVertex, objectVertex, mTransform);
            glVertex3fv(transformedVertex);
            }
        glEnd();
        }
    }
posted @ 2011-03-18 14:11  Proteas  阅读(255)  评论(0编辑  收藏  举报