使用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);//根據窗口變化實時重繪窗口
    
}

 

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