gluOrtho2D作用

 gluOrtho2D 函数设置二维正交裁剪区域。 相当于调用 zNear = -1 且 zFar = 1 的 glOrtho 。

    glOrtho定义二维正交投影矩阵,这个矩阵会把视图(摄像机)空间的坐标转换到一个裁剪空间,一言以蔽之:glOrtho定义了裁剪空间(Clip Space)

void WINAPI glOrtho(
   GLdouble left,
   GLdouble right,
   GLdouble bottom,
   GLdouble top,
   GLdouble zNear,
   GLdouble zFar
);

参数

left, right 指定可视空间的左边界和右边界

bottom, top 指定可视空间的下边界和上边界

zNear:距离较近的深度剪裁平面。

zFar:到更远深度剪裁平面的距离。

正交投影的裁剪空间如图:

我们写gl代码时候,glOrtho是用来指定屏幕绘制区域的逻辑坐标范围的,调用glOrtho后,我们代码中要传给着色器的顶点坐标值,就不再是规范化了的取值范围,不再是-1~1;而是我们自定义的一个范围, 我们自己所绘制的图形的坐标必须设置在这个范围内,超出这个范围的物体不会被绘制。

如果想把逻辑坐标范围变成规范化坐标(-1~1)只需要这样调用:

glOrtho(-1,1,-1,1,-1,1); 这样调用所产生的坐标系为:原点在中间 x:[-1,1],y:[-1,1]。

看来glOrtho同时也定义了原点(0,0)的方位。

  •  例1我们这样调:glOrtho(0,100,0,100,-100,100);那么我们的坐标空间范围是:

        x:[0,100](x取0在最左边,x取100在最右边)

        y:[0,100](y为0在最下方bottom,y为100在最上方top)

        因此得到原点在左下角

  • 例2 glOrtho(100,0,100,0,-100,100);坐标空间范围是:

        x:[0,100](100最左边,0最右边)

        y:[0,100](100在最下方,0在最上方)

        因此得到原点在右上角

  • 例3 glOrtho(-100,100,-100,100,-100,100);坐标空间范围是:

        x:[-100,100](-100最左边,100最右边)

        y:[-100,100](-100在最下方,100在最上方)

         因此得到原点在中心点

代码案例:

void render()
{

        //! 指定以下的操作针对投影矩阵
        glMatrixMode(GL_PROJECTION);
        //! 将投影举证清空成单位矩阵
        glLoadIdentity();
		int WIDTH = 500;
		int HEIGHT = 500;
		glViewport(0, 0, WIDTH, HEIGHT);

        glOrtho(0,500, 500,0,-100,100);//左上角为原点
		//以0-500为坐标范围,画我们的坐标系空间矩形
		Vertex  viewRect[] =
		{
			{0,    0,     0,  0.5,  0.5,  0.5},
			{WIDTH,   0,     0,  0.5,  0.5,  0.5},
			{0,    HEIGHT,    0,  0.5,  0.5,  0.5},
			{WIDTH,  HEIGHT,    0,  0.5,  0.5,  0.5},
		};

		glEnableClientState(GL_VERTEX_ARRAY);
		glEnableClientState(GL_COLOR_ARRAY);
		glVertexPointer(3, GL_FLOAT, sizeof(Vertex), viewRect);
		glColorPointer(3, GL_FLOAT, sizeof(Vertex), &viewRect[0].r);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

		//以0-500为坐标范围 画三角形
        Vertex  vertex[]  =   
        {
            {10,    10,     0,  1,  0,  0},//红色顶点 //左上角
            {490,   10,     0,  0,  1,  0},//绿色顶点 //右上角
            {250,    250,    0,  0,  0,  1},//蓝色顶点 //中心点
        };

        glColor3f(1,0,1);
        glEnableClientState(GL_VERTEX_ARRAY);
        glEnableClientState(GL_COLOR_ARRAY);
        glVertexPointer(3,GL_FLOAT,sizeof(Vertex), vertex);
        glColorPointer(3,GL_FLOAT,sizeof(Vertex),&vertex[0].r);
        glDrawArrays(GL_LINE_LOOP,0,3);
		glLoadIdentity();

		//以-1-1为坐标范围 画三角形
		glOrtho(-1,1, -1, 1, -100, 100);//中心为原点
		Vertex  vertex1[] =
		{
			{-0.9,    -0.9,     0,  1,  0,  0},//红色顶点 //左下角
			{0.9,   -0.9,     0,  0,  1,  0},//绿色顶点 //右下角
			{0,    0,    0,  0,  0,  1},//蓝色顶点 中心点
		};
		glEnableClientState(GL_VERTEX_ARRAY);
		glEnableClientState(GL_COLOR_ARRAY);
		glVertexPointer(3, GL_FLOAT, sizeof(Vertex), vertex1);
		glColorPointer(3, GL_FLOAT, sizeof(Vertex), &vertex1[0].r);
		glDrawArrays(GL_LINE_LOOP, 0, 3);
}

运行效果:

灰色区域是视口范围:宽500高500,由代码中的glViewport指定,当我们glOrtho参数为:glOrtho(0,500, 500,0,-100,100);灰色区域中心点坐标为(250,250),也就是上方的三角形蓝色顶点坐标,当我们传的参数为glOrtho(-1,1, -1, 1, -100, 100);灰色区域中心点坐标为(0,0)。也就是下方的三角形蓝色顶点坐标。 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值