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();
}
}
OpenGL Super Bible 第四章 Transform 程序绘图部分代码解析
最新推荐文章于 2022-02-25 21:57:21 发布