把只有框架的立体图添加面

来源:互联网 发布:中国进攻日本知乎 编辑:程序博客网 时间:2024/05/12 01:56

前面虽然已经做过了带颜色的立体图形,不过大部分还是建立在画线的事实上,如果不画面的话,是没有办法在整个的立体图形中加入颜色的,今天我开始探索在面上下功夫。

在我的http://blog.csdn.net/lafengxiaoyu/article/details/51244200

博客的基础上,加入一段绘制多边形的代码即可

for (int i = 0; i < 6; ++i)      // 有六个面,循环六次  {glBegin(GL_POLYGON);for (int j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次  glVertex3fv(vertex_list[index_list[i][j]]);glEnd();}

glBegin(GL_POLYGON);

就是这个函数,用法非常简单,完整的代码如下

#include<GL/GLUT.H>    #include <windows.h>        #include <math.h>        #include <gl/GL.h>        static const GLfloat vertex_list[][3] = {-0.5f, -0.5f, -0.5f,0.5f, -0.5f, -0.5f,0.5f, 0.5f, -0.5f,-0.5f, 0.5f, -0.5f,-0.5f, -0.5f, 0.5f,0.5f, -0.5f, 0.5f,0.5f, 0.5f, 0.5f,-0.5f, 0.5f, 0.5f,};static const GLint index_list[][4] = {0, 1, 2, 3,//bottem  0, 3, 7, 4,//left  2, 3, 7, 6,//front  1, 2, 6, 5,//right  0, 1, 5, 4,//back  4, 5, 6, 7//top  };void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glRotatef(45, 1, 1, 1);glFrontFace(GL_CCW);for (int i = 0; i < 6; ++i)      // 有六个面,循环六次  {glBegin(GL_POLYGON);for (int j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次  glVertex3fv(vertex_list[index_list[i][j]]);glEnd();}glColor3f(1, 0, 0);for (int i = 0; i < 6; ++i)      // 有六个面,循环六次  {glBegin(GL_LINE_LOOP);for (int j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次  glVertex3fv(vertex_list[index_list[i][j]]);glEnd();}glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}  
其实就是加了那么一点点东西。效果嘛,还可以

这里出现了一点点小问题,就是在“后面”的边依然可以再前面被看到,这一般来说是不太科学的,这里需要一个深度函数

void glEnable(GLenum  cap);

用这个来开启

填入GL_DEPTH_TEST

如果开启,会进行深度比较并且更新深度缓存,值得注意的是即使深度缓存存在并且深度矩阵非零,不开启的话深度缓存也不会更新。

同时因为利用了深度需要清除深度缓存

glClear -- 清除viewport的缓冲区
C 语言
void glClear(GLbitfield mask);
参数
mask
可以使用 | 运算符组合不同的缓冲标志位,表明需要清除的缓冲,例如glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)表示要清除颜色缓冲以及深度缓冲,可以使用以下标志位
GL_COLOR_BUFFER_BIT: 当前可写的颜色缓冲
GL_DEPTH_BUFFER_BIT: 深度缓冲
GL_ACCUM_BUFFER_BIT: 累积缓冲
GL_STENCIL_BUFFER_BIT: 模板缓冲

也就是

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);






的后半句

完整代码如下

#include<GL/GLUT.H>    #include <windows.h>        #include <math.h>        #include <gl/GL.h>        static const GLfloat vertex_list[][3] = {-0.5f, -0.5f, -0.5f,0.5f, -0.5f, -0.5f,0.5f, 0.5f, -0.5f,-0.5f, 0.5f, -0.5f,-0.5f, -0.5f, 0.5f,0.5f, -0.5f, 0.5f,0.5f, 0.5f, 0.5f,-0.5f, 0.5f, 0.5f,};static const GLint index_list[][4] = {0, 1, 2, 3,//bottem  0, 3, 7, 4,//left  2, 3, 7, 6,//front  1, 2, 6, 5,//right  0, 1, 5, 4,//back  4, 5, 6, 7//top  };void myDisplay(void){glEnable(GL_DEPTH_TEST);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//glClear(GL_COLOR_BUFFER_BIT);glRotatef(45, 1, 1, 1);glFrontFace(GL_CCW);for (int i = 0; i < 6; ++i)      // 有六个面,循环六次  {glBegin(GL_POLYGON);for (int j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次  glVertex3fv(vertex_list[index_list[i][j]]);glEnd();}glColor3f(1, 0, 0);for (int i = 0; i < 6; ++i)      // 有六个面,循环六次  {glBegin(GL_LINE_LOOP);for (int j = 0; j < 4; ++j)     // 每个面有四个顶点,循环四次  glVertex3fv(vertex_list[index_list[i][j]]);glEnd();}glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}  




相应的,下一步把由线绘制的球体变为二维的球面

#include<GL/GLUT.H>    #include <windows.h>        #include <math.h>        #include <gl/GL.h>        float pi = 3.1415927f;float r = 0.8f;void myDisplay(void){//glClear(GL_COLOR_BUFFER_BIT);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);glRotatef(30, 1, 1, 1);glFrontFace(GL_CCW);for (int j = 0; j < 20; ++j){for (int i = 0; i < 20; i++){glBegin(GL_POLYGON);glVertex3f(r*sin(pi*j / 20)*cos(2 * pi*i / 20), r*sin(pi*j / 20)*sin(2 * pi*i / 20), r*cos(pi*j / 20));glVertex3f(r*sin(pi*j / 20)*cos(2 * pi*(i+1) / 20), r*sin(pi*j / 20)*sin(2 * pi*(i+1) / 20), r*cos(pi*j / 20));glVertex3f(r*sin(pi*(j + 1) / 20)*cos(2 * pi*(i + 1) / 20), r*sin(pi*(j + 1) / 20)*sin(2 * pi*(i + 1) / 20), r*cos(pi*(j + 1) / 20));glVertex3f(r*sin(pi*(j + 1) / 20)*cos(2 * pi* i / 20), r*sin(pi*(j + 1) / 20)*sin(2 * pi* i / 20), r*cos(pi*(j + 1) / 20));glEnd();}}glColor4f(1, 0, 0, 0.1);for (int j = 0; j < 20; ++j){glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r*sin(pi*j / 20)*cos(2 * pi*i / 20), r*sin(pi*j / 20)*sin(2 * pi*i / 20), r*cos(pi*j / 20));}glEnd();glBegin(GL_LINE_STRIP);for (int i = 0; i <= 20; i++){glVertex3f(r*sin(pi*i / 20)*cos(2 * pi*j / 20), r*sin(pi*i / 20)*sin(2 * pi*j / 20), r*cos(pi*i / 20));}glEnd();}glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(500, 500);glutCreateWindow("opengl1");glutDisplayFunc(&myDisplay);glutMainLoop();return 0;}  

效果如下


另我感到非常聒噪的是为什么线变成虚的了。。再说再说,嗯嗯,现在好歹是把之前的框架变成现在的面了,就可以对面进行处理了,后面对面进行面的颜色各种处理,gogogo!

2 0
原创粉丝点击