使用OpenGL生成一个简单的莫比乌斯环

生成的结果如下,初学者,只是使用了一些基础的函数:

代码如下:

#include<iostream>
#include<math.h>

using namespace std;
#include<gl/glut.h>

//莫比乌斯环座标生成宏
#define MobiusX(u,v) ((1+(v)*cos((u)/2)/2)*cos(u))
#define MobiusY(u,v) ((1+(v)*cos((u)/2)/2)*sin(u))
#define MobiusZ(u,v) ((v)*sin((u)/2)/2)

const int P1 = 8, P2 = 8;
const double PI = 3.1415926;//圆周率pi

//储存绘制点座标
GLfloat CP0[P1][P2][3];//点座标数组

GLfloat light_ambient[] = { 0.2,0.2,0.2,1.0 };//环境光
GLfloat light_diffuse[] = { 0.54f,0.168f,0.886f,0 };//散射光
GLfloat light_specular[] = { 1.0,1.0,1.0,0.0 };//镜面光

GLfloat light0_position[] = { 0,0,0,1 };//0号光源位置
GLfloat light1_position[] = { -1,0,0,1 };//1号光源位置

//莫比乌斯环函数声明
void disinit();//显示初始化
void displayFace();//绘制图形
void reshap(GLsizei w, GLsizei h);//窗口修正
int mobius(int argc, char* argv[]);//莫比乌斯环生成函数

int main(int argc, char* argv[])
{
    mobius(argc,argv);
    return 0;
}

int mobius(int argc, char* argv[])
{
    glutInit(&argc, argv);//初始化glut库
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);//设置:双缓存,RGB,深度缓冲
    glutInitWindowPosition(0, 0);//设置窗口显示的位置
    glutInitWindowSize(800, 600);//设置窗口大小
    glutCreateWindow("莫比乌斯环");//创建创建窗口,设置标题

    //窗口控制
    disinit();//初始化
    glutReshapeFunc(reshap);//重塑函数
    glutDisplayFunc(displayFace);//绘制函数

    //主循环
    glutMainLoop();
    return 0;
}

void disinit()
{
    //座标初始化
    int i, j;
    GLfloat t1 = (GLfloat)2 * PI / (P1 - 1), t2 = (GLfloat)2 / (P2 - 1), u = 0, v = -1, b = 2;//b用来控制图形的绝对大小
    for (i = 0; i < P1; ++i) {
        for (j = 0; j < P2; ++j) {
            CP0[i][j][0] = MobiusX(u + t1 * i, v + t2 * j)/b;
            CP0[i][j][1] = MobiusY(u + t1 * i, v + t2 * j)/b ;
            CP0[i][j][2] = MobiusZ(u + t1 * i, v + t2 * j)/b ;
            cout << "x=" << CP0[i][j][0];
            cout << ",y=" << CP0[i][j][1];
            cout << ",z=" << CP0[i][j][2] << endl;//打印每个点的座标
        }
    }
    glClearColor(0, 0, 0, 0);//黑色背景
    //设置0号光源
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light0_position);
    //设置1号光源
    glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
    glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position);

    glEnable(GL_LIGHTING);//使用光照
    glEnable(GL_LIGHT0);//开启0号光源
    glEnable(GL_LIGHT1);//开启1号光源

    //让图形可以反射光
    glEnable(GL_AUTO_NORMAL);
    //启用深度测试
    glEnable(GL_DEPTH_TEST);

}

void displayFace()//绘制图形
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//清除颜色缓存和深度缓存

    glRotatef(70, 1, 0, 0);//旋转70度
    //绘制曲面
    glEnable(GL_LINE_SMOOTH);//平滑线段
    
    glEnable(GL_MAP2_VERTEX_3);//激活函数glMap2
    //曲面求值函数
    glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, P1, 0, 1, 3*P2, P2, &CP0[0][0][0]);
    //生成均匀分布的参数
    glMapGrid2f(20, 0.0, 1, 20, 0.0, 1);
    //绘制
    glEvalMesh2(GL_FILL, 0, 20, 0, 20);

    //从缓冲区加载图形
    glutSwapBuffers();
}

void reshap(GLsizei w, GLsizei h)//窗口修正
{
    glViewport(0, 0, w, h);//根据窗口变化实时重绘窗口
    
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章