[OpenGL(C)] - 旋转立体三角形
来源:互联网 发布:软件编程培训中心 编辑:程序博客网 时间:2024/05/04 18:50
//新建Win32控制台程序->空程序(Win32 Console Application->An Empty Project)
/*
glGenLists(i):自动分配没有使用的编号(返回的是编号中最小的一个,如果函数返回零,表示分配失败)
glIsList:判断一个编号是否已经被用作显示列表。
创建显示列表:
glNewList(list, GL_COMPILE);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glEnd();
注意:1.显示列表只能装入OpenGL函数
2.不能装入其它内容,如if
3.如装入OpenGL的函数带有返回值都不能装入,glCallList和glCallLists函数都不知道如何处理这些返回值。
4.在网络方式下,设置客户端状态的函数也无法被装入到显示列表,这是因为显示列表被保存到服务器端,各种设置客户端状态的函数在发送到服务器端以前就被执行了,而服务器端无法执行这些函数。
5.分配、创建、删除显示列表的动作也无法被装入到另一个显示列表,但调用显示列表的动作则可以被装入到另一个显示列表。
调用显示列表:
GLuint lists[] = {1, 3, 4, 8};
glListBase(10); //偏移量,实际上调用的是编号为11, 13, 14, 18的四个显示列表
glCallLists(4, GL_UNSIGNED_INT, lists); //调用一系列的显示列表;在使用该函数前需要用glListBase函数
//第一个参数表示了要调用多少个显示列表。
//第二个参数表示了这些显示列表的编号的储存格式,可以是
GL_BYTE(每个编号用一个GLbyte表示)
GL_UNSIGNED_BYTE(每个编号用一个GLubyte表示)
GL_SHORT
GL_UNSIGNED_SHORT
GL_INT
GL_UNSIGNED_INT,GL_FLOAT
//第三个参数表示了这些显示列表的编号所在的位置。
//注:“调用显示列表”这个动作本身也可以被装在另一个显示列表中。
//要调用编号为10的显示列表,直接使用glCallList(10);就可以了
销毁显示列表:
使用glDeleteLists(20, 4);将销毁20,21,22,23这四个显示列表。
*/
#include <math.h>
#include <GL/glut.h>
#define ColoredVertex(c,v) do{ glColor3fv(c); glVertex3fv(v); }while(0)
GLfloat angle = 0.0f;
void RevolveTriangle(){
static int list = 0;
glEnable(GL_DEPTH_TEST);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(list == 0){ //如果显示列表不存在,则创建
GLfloat PointA[] = { 0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6}, //设置4个角的位置
PointB[] = {-0.5f,-sqrt(6.0f)/12,-sqrt(3.0f)/6},
PointC[] = { 0.0f,-sqrt(6.0f)/12, sqrt(3.0f)/3},
PointD[] = { 0.0f, sqrt(6.0f)/4, 0};
GLfloat ColorR[] = {1,0,0}, //设置4个角的颜色
ColorG[] = {0,1,0},
ColorB[] = {0,0,1},
ColorY[] = {1,1,0};
list = glGenLists(1);
glNewList(list,GL_COMPILE);
glBegin(GL_TRIANGLES); //画出4个三角形
//平面BAD(左)
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorY,PointD);
//平面ABC(正)
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorB,PointC);
//平面ACD(右)
ColoredVertex(ColorR,PointA);
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorY,PointD);
//平面CBD(底)
ColoredVertex(ColorB,PointC);
ColoredVertex(ColorG,PointB);
ColoredVertex(ColorY,PointD);
glEnd();
glEndList();
}
//已经创建了显示列表,在每次绘制正四面体时将调用它
glPushMatrix(); //入矩阵栈
glRotatef(angle,1,0.5,0); //旋转
glCallList(list); //调用列表
glPopMatrix(); //出矩阵栈
glutSwapBuffers();
}
void action(){
if(angle >= 360.0f){
angle = 0.0f;
}
angle++;
RevolveTriangle();
}
int main(int argc,char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowPosition(200,200);
glutInitWindowSize(640,480);
glutCreateWindow("Revolve Triangle");
glutDisplayFunc(&RevolveTriangle);
glutIdleFunc(&action);
glutMainLoop();
return 0;
}
- [OpenGL(C)] - 旋转立体三角形
- OpenGL绘制旋转三角形实例
- OpenGL绘制旋转三角形实例
- [C++]D3D中立体的移动+旋转
- android opengl es 三角形、正方形自动旋转
- opengl es 实现旋转的三角形
- opengl 制作 3D 彩色旋转三角形
- opengl 画三角形和四边形,平移+旋转
- qt opengl lesson5 绘制3d立体旋转图形
- Opengl ES 学习笔记 2:绘制一个旋转的三角形
- OpenGL画四个三角形组成四面体,并进行旋转
- 立体旋转(滚动圆环)
- CSS3立体球体旋转
- OpenGL: OpenGL实现立体显示
- OpenGL实现立体显示
- OpenGL: 实现立体显示
- OpenGL立体显示实现
- C#OpenGL(SharpGL)绘制可旋转长方体
- Shell窗体
- 添加MFC类时,从基类中找不到CRecordSet的解决办法
- 英语中容易混淆的单词词意
- 二维费用背包
- zoj 1073 Round and Round We Go
- [OpenGL(C)] - 旋转立体三角形
- 控件之AutoCompleteTextView
- ubuntu openssh
- 寒假篇 -2
- HDU2159 FATE 二维费用背包-完全背包
- C# 获取dll入口点
- 用Perl脚本实现MS批量任务
- 教你把「显示桌面」快捷键 找回来!
- 银行家算法(java)