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