openGL的gluOrtho2D以及glViewport的理解

在做图形学实验的时候,一开始对gluOrtho2D的定义表示非常不解,百度了很多资料,终于理解了这个函数的用法。

1、gluOrtho2D
设置一个正交投影矩阵,给定左,右,上,下,但固定的近平面和远平面分别为-1。

gluOrtho2D( left, right, bottom, top );

在这里插入图片描述
由于far跟near的值已经确定,因此只需要看4个参数即可
通俗的说,这4个值分别就是左右上下四个边界
即,第1第3个参数决定左下角坐标,第2第4个参数决定右上角坐标
所以我们显示的视野由(left,bottom)和(right,top)来裁剪出来的

void ReshapeFcn(int newwidth, int newheight)
{
	glViewport(0, 0, newwidth, newheight);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(0.0, GLdouble(newwidth), 0.0, GLdouble(newheight));

	width = newwidth;
	height = newheight;
}

这里的ReshapeFcn(int newwidth, int newheight)就把视野裁剪为宽为newwidth,长为newheight且限制在第一象限的长方形。

又如

#include <gl/glut.h>

//不显示控制台窗口
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")

void display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    //画分割线,分成四个视见区
    glViewport(0, 0, 400, 400);
    glBegin(GL_LINES);
    glVertex2f(-1.0, 0);
    glVertex2f(1.0, 0);
    glVertex2f(0.0, -1.0);
    glVertex2f(0.0, 1.0);
    glEnd();
    
    //定义在左下角的区域
    glColor3f(0.0, 1.0, 0.0);
    glViewport(0, 0, 200, 200);
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();


    //定义在右上角的区域
    glColor3f(0.0, 0.0, 1.0);
    glViewport(200, 200, 200, 200);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在左上角的区域
    glColor3f(1.0, 0.0, 0.0);
    glViewport(0, 200, 200, 200);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();

    //定义在右下角
    glColor3f(1.0, 1.0, 1.0);
    glViewport(200, 0, 200, 200);//注意,后面这两个参数是高度和宽度,而不是坐标
    glBegin(GL_POLYGON);
    glVertex2f(-0.5, -0.5);
    glVertex2f(-0.5, 0.5);
    glVertex2f(0.5, 0.5);
    glVertex2f(0.5, -0.5);
    glEnd();
    glFlush();
}

void init()
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glColor3f(1.0, 1.0, 1.0);
    
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //定义剪裁面
    gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400, 400);
    glutCreateWindow("蒋昌松_使用glbegin_glend_glViewport");
    glutDisplayFunc(display);



    init();
    glutMainLoop();
}

程序运行结果

在这里插入图片描述
可以看到

 //定义剪裁面
        gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

这个函数将剪裁面设为一个正方形,涵盖了4个象限,规定了边界的长度,如果画的图形超过这个长度则不会显示,如

 //定义在左下角的区域
        glColor3f(0.0, 1.0, 0.0);
        glViewport(0, 0, 200, 200);
        glBegin(GL_POLYGON);
        glVertex2f(-0.5, -0.5);
        glVertex2f(-0.5, 0.5);
        glVertex2f(0.5, 0.5);
        glVertex2f(0.5, -0.5);
        glEnd();

就在左下角画了一个绿色正方形
2、glOrtho()
这个函数即为加入了近平面和远平面的gluOrtho2D(),原型如下

glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) 

创造对应的平行视景体(长方体),如图
在这里插入图片描述
只有在视景体里的物体才能显示出来。
如果最后两个值是(0,0),也就是near和far值相同了,视景体深度没有了,整个视景体都被压成个平面了,就会显示不正确。
3、glViewport
glViewport定义了视口,即你眼睛(摄像机)可以看到的面积,这个面积跟窗口大小也有联系
定义:

glViewport定义视口,即视见窗口,是从世界坐标系窗口到屏幕坐标系窗口的映射,决定了gluOrtho2D定义的剪裁main如何映射到屏幕上,通过调节glViewport的参数, 可以调节模型在屏幕窗口上的缩放和显示位置。

三者的基本关系为:

世界坐标系内模型 --> gluOrtho2D按正交投影截取要显示的部分 --> glutInitWindowSize定义显示窗口大小(即定义在屏幕上可作图的显示区域)–> glViewport定义视口(定义世界坐标系的截取窗口在屏幕显示窗口上绘制的大小、位置)

可以知道的是,glViewport定义视口只与窗口大小有关,与gluOrtho2D裁剪的部分大小无关。

4、参考的博客与网站
https://blog.csdn.net/dcrmg/article/details/53340302
https://blog.csdn.net/mydreamremindme/article/details/9817083
https://www.cnblogs.com/1024Planet/p/5641410.html
https://cloud.tencent.com/developer/ask/132478
https://blog.csdn.net/peng6662001/article/details/7082436

猜你喜欢

转载自blog.csdn.net/weixin_42316707/article/details/84645070