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

        }

    }
 
   

你可能感兴趣的:(transform)