glOrtho与gluOrtho2D 的作用

news2024/11/26 2:26:27

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);
}

运行效果:灰色区域是我们的坐标范围x和y都是0-500,上面的三角形蓝色顶点坐标是(250,250),下面的三角形蓝色顶点坐标是(0,0),这两个点都在灰色矩形中心点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/872846.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Netty:DelimiterBasedFrameDecoder分析

说明 io.netty.handler.codec.DelimiterBasedFrameDecoder是ByteToMessageDecoder的一个实现类,用一个或多个分割符拆分接收到的 ByteBuf。这个主要用于解析分隔符在帧的末尾的情况。注意,如果分割符在帧的开头,那么解析出来的帧的长度是0&a…

从一到无穷大 #10 讨论 Apache IoTDB 大综述中看到的优劣势

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 文章目录 引言问题定义新技术数据模型schemalessTsfile设计双MemTable高级可扩展查询其他 IotD…

如何实现浅拷贝和深拷贝

一、浅拷贝的实现方法 1.Object.assign方法 let obj1{name:"aaa",}let obj2{age:20}let obj3Object.assign(obj1,obj2)// obj3.age30console.log(obj1);console.log(obj3);console.log(obj1obj3);console.log(obj1obj3); 结果为: 2.直接赋值 let obj1{n…

sql中union all、union、intersect、minus的区别图解,测试

相关文章 sql 的 join、left join、full join的区别图解总结,测试,注意事项 1. 结论示意图 对于intersect、minus,oracle支持,mysql不支持,可以变通(in或exists)实现 2.测试 2.1.创建表和数…

将Map存到数据库中,并且支持数据类型原样取回

1.数据库设计 1.1 表设计 create table variables (id bigint not null comment 主键,business_key varchar(128) null comment 业务key,data_key varchar(128) null comment Map中的key,data_value varchar(…

35岁职业危机?不存在!体能断崖?不担心

概述 90年,硕士毕业,干了快8年的Java开发工作。现年33岁,再过2年就要35岁。 工作这些年,断断续续也看过不少35岁找不到工作,转行,降薪入职的传闻、案例。 35岁,甚至30岁之后,体能…

【Linux操作系统】文件描述符fd

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️林 子       🛰️博客专栏:✈️ Linux之路       🛰️社区 :✈️ 进步学堂       &#x1…

easyx图形库基础:1.基本概念的介绍+图形的绘制。

基本概念的介绍图形的绘制 一.基本概念的介绍。1.为什么要使用easyx图形库2.安装easyx图形库。3.语法相关 二.图形绘制1.窗体创建和坐标的概念。1.基本窗体的创建。2.坐标概念3.改变逻辑坐标。 2.设置图形颜色1.设置描边颜色和描边样式。2.设置图形填充颜色和填充样式3.绘制图形…

【第二阶段】kotlin的函数类型作为返回类型

fun main() {//调用,返回的是一个匿名类型,所以info就是一个匿名函数val infoshow("",0)//info接受的返回值为匿名类型,此时info就是一个匿名函数println(info("kotlin",20)) }//返回类型为一个匿名函数的返回类型fun show(name:Str…

编程工具合集

须知: 本博文只是为了记录程序员在编程中所用到的编程工具以及效率软件,如有侵权,请告知! VSCode 英文官网:https://code.visualstudio.com/ 中文官网:http://vscode.p2hp.com/ win下载链接:VS…

ModaHub魔搭社区:AI时代连接硬件和上层应用的中间层基础设施。

从类比的角度理解AI Infra:AI时代连接硬件和上层应用的中间层基础设施。传统本地部署时代,三大基础软件(数据库、操作系统、中间件)实现控制硬件交互、存储管理数据、网络通信调度等共性功能,抽象并隔绝底层硬件系统的复杂性,让上层应用开发者能够专注于业务逻辑和应用功…

Kotlin入门:变量和函数——02

目录 一、Kotlin 基本数据类型 ​编辑 二、变量 val 关键字: var 关键字: 类型推断: 可空类型: 三、函数 基本函数语法: 单表达式函数: 默认参数值: 命名参数: 一、Kotlin 基本数据类型 Kotlin 的基本数…

CCLINK IE 转MODBUS-RTU网关modbusrtu与485区别

远创智控YC-CCLKIE-RTU。这款产品的主要功能是将各种MODBUS-RTU、RS485、RS232设备接入到CCLINK IE FIELD BASIC网络中。 那么,这款通讯网关又有哪些特点呢?首先,它能够连接到CCLINK IE FIELD BASIC总线中作为从站使用,同时也能连…

sqlyog下载和卸载的最新详细过程,超多图快速安装或者卸载

目录 1.SQLyog的介绍2.sqlyog的下载和安装3.sqlyog的卸载 ✨ 原创不易,还希望各位大佬支持一下! 👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论&#xff0c…

7.5.tensorRT高级(2)-RAII接口模式下的生产者消费者多batch实现

目录 前言1. RAII接口模式封装生产者消费者2. 问答环节总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-RAI…

Netty核心源码解析(一)

Netty是什么? Netty是Jboss提供的一个Java 开源框架,主要针对TCP协议的高并发场景Netty本质是对Java NIO做了封装的网络通信框架,主要作用是Java NIO基本接口的封装,提供了网络通信中线程同步,编解码,粘包拆…

小龟带你敲排序之冒泡排序

冒泡排序 一. 定义二.题目三. 思路分析(图文结合)四. 代码演示 一. 定义 冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元…

Kettle系列(一)下载安装与基础配置

Kettle系列(一)下载安装与基础配置 说明一、下载二、目录结构三、基础配置(1)环境变量(2)kettle配置 四、连接mysql8五、连接其他数据库六、总结 说明 更新时间:2023/08/13 17:47 本文记录了wi…

openGauss学习笔记-38 openGauss 高级数据管理-游标

文章目录 openGauss学习笔记-38 openGauss 高级数据管理-游标38.1 语法格式38.2 参数说明38.3 示例 openGauss学习笔记-38 openGauss 高级数据管理-游标 为了处理SQL语句,存储过程进程分配一段内存区域来保存上下文联系。游标是指向上下文区域的句柄或指针。借助游…

【Pytroch】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Pytroch】基于决策树算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 决策树是一种常用的机器学习算法,用于分类和回归任务。它通过树状结构表示数据的决策…