把只有框架的立体图添加面
来源:互联网 发布:中国进攻日本知乎 编辑:程序博客网 时间: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!
- 把只有框架的立体图添加面
- 奇妙的三维立体图
- 立体图
- 立体图
- 如何画分子结构的立体图
- 分子结构的立体图怎么画?
- 三维立体图的原理和欣赏方法
- 基于ArcScene的裸眼立体图制作说明
- Matlab数据的可视化 -- 柱形立体图
- 编程之美只有加法的面试题
- 雅虎公司的c#面试题(面试题只有此部分属于C#面试题)
- 雅虎公司的c#面试题(面试题只有此部分属于C#面试题)
- Java GUI之创建一个只有两个按钮的框架
- app只有一个activity的ui框架设计猜想
- 一个只有99行代码的JS流程框架
- 一个只有99行代码的JS流程框架
- 框架相关的面试题
- 关于如何用OpenGL塑造中空的立体图的策略
- Android开发实践:使用Service还是Thread
- js 判断只能输入正整数或两位以内的小数(包括一位小数)
- Java核心技术(三) —— 对象与类(1)
- HTML页面的<script type="text/javascript">含义。
- 插入数据库中文乱码问题
- 把只有框架的立体图添加面
- mysql load data infile的使用
- eclipse部署web项目至本地的tomcat但在webapps中找不到
- 字符串处理----String
- 第十一章 属性设置或返回元素的class 属性
- Silverlight/WPF数据绑定oneTime,oneWay,twoWay
- Xshell输入enter全屏的问题解决
- 监控键盘状态
- Java文件路径