//显示三角形
//三角形顶点颜色不同
#include <stdlib.h>
#include <GL/glut.h>
void background(void)
{
//四个参数分别是红、绿、蓝和alpha值。
//这些值定义了窗口的颜色。这些值的范围在[0,1]之间。
glClearColor(0.0,0.0,0.0,0.0);//设置背景颜色为黑色
}
void myDisplay(void)//彩色的三角形
{
glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写
//这两个函数限制了一组或多组图元的顶点定义。
//在这两个函数中间就是你所绘制的由多个顶点组成的图元。
//函数的参数表明了所绘制的图元的类型。本例中的GL_TRIANGLES 表明所绘制的图形为三角形。
glBegin(GL_TRIANGLES);//开始画三角形
//GL_SMOOTH为缺省值,为光滑渐变模式,GL_FLAT为平坦渐变模式。
glShadeModel(GL_SMOOTH);//设置为光滑明暗模式
//3表明有三个参数,分别为红、绿、蓝,4则多一个参数alpha。
//紧跟数字后面的字母表示数据类型。本例中的glColor3f表示三个参数,数据类型为GLfloat。
glColor3f(1.0,0.0,0.0);//设置第一个顶点为红色
//窗口的中心为原心,坐标为(0,0,0)。
//横坐标向左为负,向右为正;纵坐标向上为正,向下为负;
//z坐标向屏幕里为负,屏幕外为正,坐标系符合右手定则。
glVertex2f(-1.0,-1.0);//设置第一个顶点的坐标为(-1.0,-1.0)
glColor3f(0.0,1.0,0.0);//设置第二个顶点为绿色
glVertex2f(0.0,-1.0);//设置第二个顶点的坐标为(0.0,-1.0)
glColor3f(0.0,0.0,1.0);//设置第三个顶点为蓝色
glVertex2f(-0.5,1.0);//设置第三个顶点的坐标为(-0.5,1.0)
glEnd();//三角形结束
//glFlush清空所有buffer,使所有发出的命令能在规定的时间内运行。
//一定不能忘记这一条语句。只有加了这一句,前面的命令才能执行
glFlush();//强制OpenGL函数在有限时间内运行
}
void myReshape(GLsizei w,GLsizei h)//改变窗口的大小
{
//glViewport(Glint x,Glint y,GLsizei width,GLsizei height)设置视口。
//视口是一个矩形,x,y为视口左下角的坐标,以像素为单位,缺省值为(0,0)。
//width和height分别为视口的宽和高。
//OpenGl context第一次贴到窗口上时width和height分别设置成窗口的大小
glViewport(0,0,w,h);//设置视口
//指明哪一个矩阵为当前矩阵。
//本例中GL_PROJECTION指明投影矩阵堆栈为随后的矩阵操作的目标。
glMatrixMode(GL_PROJECTION);//指明当前矩阵为GL_PROJECTION
glLoadIdentity();//将当前矩阵置换为单位阵
if(w <= h)
//定义二维正视投影矩阵。left,right分别设置左右垂直切平面的坐标,
//bottom,top分别设置上下垂直切平面的坐标。
gluOrtho2D(-1.0,1.5,-1.5,1.5*(GLfloat)h/(GLfloat)w);//定义二维正视投影矩阵
else
gluOrtho2D(-1.0,1.5*(GLfloat)w/(GLfloat)h,-1.5,1.5);
glMatrixMode(GL_MODELVIEW);//指明当前矩阵为GL_MODELVIEW
}
int main(int argc,char ** argv)
{
/*初始化*/
glutInit(&argc,argv);//初始化GLUT库并同窗口系统对话协商
//glutInitDisplayMode用来确定所创建窗口的显示模式。
//本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,
//对应的模式为GLUT_DOUBLE 双缓存窗口。
//参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
//初始化窗口的大小,第一个参数为窗口的宽度,第二个参数为窗口的高度,以像素为单位。
glutInitWindowSize(400,400);
//设置初始窗口的位置,第一个参数为窗口左上角x的坐标,
//第二个参数为窗口左上角y的坐标,以像素为单位。
//屏幕的左上角的坐标为(0,0),横坐标向右逐渐增加,纵坐标向下逐渐增加
glutInitWindowPosition(200,200);
/*创建窗口*/
glutCreateWindow("Triangle");//创建顶层窗口,窗口的名字为扩号中的参数
/*绘制与显示*/
background();
//注册当前窗口的形状变化回调函数。
//当改变窗口大小时,该窗口的形状改变回调函数将被调用。
//在此例中就是myReshape指定形状变化函数。
glutReshapeFunc(myReshape);
//注册当前窗口的显示回调函数。
//当一个窗口的图像层需要重新绘制时,
//GLUT将调用该窗口的的显示回调函数。
//在此例中的mydisplay就是显示回调函数,显示回调函数不带任何参数,
//它负责整个图像层的绘制。我们的大部分工作将集中在这个函数中。
glutDisplayFunc(myDisplay);
//进入GLUT事件处理循环。
//glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,
//并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,
//此例中为glutReshapeFunc, glutDisplayFunc。
glutMainLoop();
return(0);
}
例2主要是介绍 剪裁 堆栈操作 坐标变换。大家看看注释一目了然。
#include "windows.h"
#include <GL/gl.h>
#include <GL/glaux.h>
void myinit(void);
void CALLBACK myReshape(GLsizei w, GLsizei h);
void CALLBACK display(void);
void CALLBACK display(void)
{
GLdouble eqn[4] = {1.0, 0.0, 0.0, 0.0}; //平面 x=0
glClear(GL_COLOR_BUFFER_BIT);//buffer设置为颜色可写
glColor3f (1.0, 0.0, 1.0);//定义颜色
//一些移动或旋转等变换后,使用glPushMatrix();
//OpenGL 会把这个变换后的位置和角度保存起来。
//然后你再随便做第二次移动或旋转变换,再用glPopMatrix();
//OpenGL 就把刚刚保存的那个位置和角度恢复。
glPushMatrix();
glTranslatef (0.0, 0.0, -5.0);//模型相对照相机焦点平移
/* clip the left part of wire_sphere : x<0 */
//平面裁剪函数 plane是GL_CLIP_PLANEi(i=0,1,...),指定裁剪面号
glClipPlane (GL_CLIP_PLANE0, eqn);
//在调用附加裁剪函数之前,必须先启动glEnable(GL_CLIP_PLANEi),
//使得当前所定义的裁剪平面有效;当不再调用某个附加裁剪平面时,
//可用glDisable(GL_CLIP_PLANEi)关闭相应的附加裁剪功能
glEnable (GL_CLIP_PLANE0);
//该函数中第一个变量angle制定模型旋转的角度,
//单位为度,后三个变量表示以原点(0,0,0)到点(x,y,z)的连线为轴线逆时针旋转物体。
//例如,glRotatef(-30.0,0.0,0.0,1.0)的结果是绕z轴顺时针旋转90.0度。
glRotatef (-90.0, 1.0, 0.0, 0.0);
auxWireSphere(1.0);//绘制一半径为1.0的网状球体
glPopMatrix();//见glPushMatrix();
glFlush();//强制OpenGL函数在有限时间内运行
}
void myinit (void)
{
glShadeModel (GL_FLAT);//设置为光滑明暗模式
}
void CALLBACK myReshape(GLsizei w, GLsizei h)
{
glViewport(0, 0, w, h);//设置视口 左下角的坐标(0,0)
glMatrixMode(GL_PROJECTION); //指明哪一个矩阵为当前矩阵。
glLoadIdentity();//将当前矩阵置换为单位阵
//创建一个对称透视视景体
//定义视野在X-Z平面的角度 60.0
//投影平面宽度与高度的比率 (GLfloat) w/(GLfloat) h
//远近裁剪面沿Z负轴到视点的距离 1.0, 20.0
gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);
//从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。
//在OpenGL中,实现这两种功能甚至使用的是同样的函数。
//由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,
//应先设置当前操作的矩阵为“模型视图矩阵”。
//设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样:
glMatrixMode(GL_MODELVIEW);
}
void main(void)
{
//glutInitDisplayMode用来确定所创建窗口的显示模式。
//本例中的参数GLUT_SINGLE 指定单缓存窗口,这也是缺省模式,
//对应的模式为GLUT_DOUBLE 双缓存窗口。
//参数GLUT_RGB指定颜色RGBA模式,这也是缺省模式,对应的模式为GLUT_INDEX 颜色索引模式窗口。
auxInitDisplayMode (AUX_SINGLE | AUX_RGB);
auxInitPosition (0, 0, 500, 500);大小x=500 y=500 (0,0)是屏幕左上点
auxInitWindow ("Arbitrary Clipping Planes");//创建顶层窗口,窗口的名字为扩号中的参数
myinit ();
//注册当前窗口的形状变化回调函数。
//当改变窗口大小时,该窗口的形状改变回调函数将被调用。
//在此例中就是myReshape指定形状变化函数。
auxReshapeFunc (myReshape);
//进入GLUT事件处理循环。
//glutMainLoop函数在GLUT程序中最多只能调用一次,它一旦被调用就不再返回,
//并且调用注册过的回调函数。所以这个函数必须放在注册回调函数的后面,
//此例中为glutReshapeFunc, glutDisplayFunc。
auxMainLoop(display);
}