[OpenGL(C)] - 旋转立体三角形
GLUT库(v1.1):https://files.cnblogs.com/hcbin/glutdlls37beta.zip
//注:本人使用VS2008创建此程序
//新建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;
}
//新建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;
}
个性签名:做要做好,做到不三不四不如不做。