生成的结果如下,初学者,只是使用了一些基础的函数:
代码如下:
#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);//根据窗口变化实时重绘窗口
}