zoukankan      html  css  js  c++  java
  • 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();
            }
        }
  • 相关阅读:
    P3387 【模板】缩点 tarjan
    P2831 愤怒的小鸟 状压dp
    交流帖
    P3959 宝藏 模拟退火。。。
    B1060 [ZJOI2007]时态同步 dfs
    P1850 换教室 概率dp
    树链刨分(待修改)
    B3403 [Usaco2009 Open]Cow Line 直线上的牛 deque
    B3402 [Usaco2009 Open]Hide and Seek 捉迷藏 最短路
    B5248 [2018多省省队联测]一双木棋 状压dp
  • 原文地址:https://www.cnblogs.com/Proteas/p/2335678.html
Copyright © 2011-2022 走看看