OpenGL学习2

//显示三角形
//三角形顶点颜色不同
#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);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值