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

来源:互联网 发布:淘宝店铺怎样引流 编辑:程序博客网 时间:2024/05/17 05:01

 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<numMajor; ++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();        }    }


原创粉丝点击