OPENGL知识点整理(一)

2023-11-03

OPENGL知识点整理(一)

概述内容为阅读相关博主文档后整理,因此,相当部分的内容直接引用自如下链接:
https://www.jianshu.com/p/5da5a17ad5cb
https://blog.csdn.net/u012861978/article/details/97833643

1.坐标系

在opengl中,根据处理的先后次序来分,主要有如下几个坐标系:

1.1 物体坐标系

就是以要被渲染物体的重心作为坐标体系,可以标识出该物体的各个定点的坐标(个人理解)
不同的物体都有其自己的物体坐标系
在这里插入图片描述

1.2 惯性坐标系

惯性坐标系原点域物体的物理坐标系相同,但是其x,y,z轴与世界坐标系平行,方向相同,并且可以通过平移转换成世界坐标系

在这里插入图片描述
物体坐标系中定点的坐标位置通过三轴转换(旋转矩阵)的矩阵可以转换到惯性坐标系中该顶点的坐标位置

1.3 世界坐标系

世界坐标系是用来描述OpenGL场景的坐标系。该坐标系的三轴方向以右手坐标系表示:
在这里插入图片描述
惯性坐标系下的定点的坐标位置可以通过平移转换成世界坐标系下的坐标位置。

1.4 眼坐标系

眼坐标系可以理解为相机坐标系,相机就是一个类似于人眼这样可以通过不同角度观察OpenGL场景的存在,根据其镜头的指向可以得到眼坐标系(相机坐标系)

将世界坐标系下定点的坐标位置转换成眼坐标系下的坐标位置可以理解为物体坐标系到世界坐标系的转换的逆操作,因为对于世界坐标系来说,眼(相机)也是一个模型。

1.5 裁剪坐标系

因为对于眼睛来说,其是有可视范围的,太近或者太远的内容就无法出现在视野中,因此需要将不在视野中的物体裁减掉。
这个裁剪动作是通过投影来做到的,投影是以在眼坐标系中的定点坐标进行操作的。
投影的方式有平行和透视两种:
平行的情况下,物体不会出现缩放的情况,只是有遮挡
透视的情况下,以眼坐标系为观察原点,物体定点的坐标位置还需要进行缩放
在这里插入图片描述
因此,根据不同的投影方式,可以将裁剪理解为两种不同的几何体:
平行的情况下,裁剪坐标系就是一个立方体
透视的情况下,裁剪坐标西是一个棱台
如下图(右侧为平行投影,左侧为正交投影):

1.6 归一化坐标系

将裁剪坐标系中的几何体的x,y,z轴的范围都所见到[-1,1]的范围内,这个操作叫做归一化操作。
因此,对裁剪坐标系下的物体的定点进行归一化操作后,每个定点的坐标的x,y,z的值范围都在[-1,1]内。

1.7 屏幕坐标系

屏幕坐标系是左手坐标系
以屏幕左上角为原点,向下为Y轴,向右为X轴,向屏幕内为Z轴
在这里插入图片描述
将归一化坐标系内的物体的定点坐标转换到屏幕坐标系下时,只需要将z轴的值取反即可。

函数glViewport()函数可以设置将物体渲染到屏幕的哪块区域。

2. 坐标系的转换

物体坐标系 * 旋转矩阵1 = 惯性坐标系
惯性坐标系 * 平移矩阵1 = 世界坐标系
世界坐标系 * (旋转矩阵2 * 平移矩阵2) = 眼坐标系
眼坐标系 * 投影矩阵= 裁剪矩阵

之所以只列出上面几个坐标的转换,是因为后面的归一化,屏幕坐标系的转换是由OpenGL来完成的。
在这里插入图片描述

其中,
旋转矩阵1 * 平移矩阵1 = 模型矩阵
旋转矩阵2 * 平移矩阵2 = 视图矩阵
因此,一共有三个重要的矩阵:模型矩阵,视图矩阵,投影矩阵,简称mvp (model view, projection)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OPENGL知识点整理(一) 的相关文章

  • 如何使用MemoryCache代替Timer来触发一个方法?

    以下方法通过等待已运行操作的结果来处理并发请求 对数据的请求可能会使用相同 不同的凭据同时出现 对于每组唯一的凭据 最多可以有一个GetCurrentInternal呼叫正在进行中 当准备就绪时 该呼叫的结果将返回给所有排队的服务员 pri
  • 将内置类型转换为向量

    我的 TcpClient 类接受vector
  • 读取文件特定行号的有效方法。 (奖励:Python 手册印刷错误)

    我有一个 100 GB 的文本文件 它是来自数据库的 BCP 转储 当我尝试导入它时BULK INSERT 我在第 219506324 行上收到一个神秘错误 在解决此问题之前 我想看看这一行 但可惜的是我最喜欢的方法 import line
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 将 System.Windows.Input.KeyEventArgs 键转换为 char

    我需要将事件参数作为char 但是当我尝试转换 Key 枚举时 我得到的字母和符号与传入的字母和符号完全不同 如何正确地将密钥转换为字符 这是我尝试过的 ObserveKeyStroke this new ObervableKeyStrok
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 关于在 Windows 上使用 WiFi Direct Api?

    我目前正在开发一个应用程序 我需要在其中创建链接 阅读 无线网络连接 在桌面应用程序 在 Windows 10 上 和平板电脑 Android 但无关紧要 之间 工作流程 按钮 gt 如果需要提升权限 gt 创建类似托管网络的 WiFi 网
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • 如何将整数转换为 void 指针?

    在 C 中使用线程时 我面临警告 警告 从不同大小的整数转换为指针 代码如下 include
  • 如何将自定义 JSON 文件添加到 IConfiguration 中?

    我正在使用 asp net Autofac 我正在尝试加载自定义 JSON 配置文件 并基于该文件创建 实例化 IConfiguration 实例 或者至少将我的文件包含到默认情况下构建的 IConfiguration asp net 中
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • Process.Start() 方法在什么情况下返回 false?

    From MSDN https msdn microsoft com en us library e8zac0ca v vs 110 aspx 返回值 true 表示有新的进程资源 开始了 如果由 FileName 成员指定的进程资源 St
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐

  • 【数据结构与算法】3、虚拟头节点、动态数组的缩容、动态数组和单链表的复杂度、数组的随机访问

    目录 一 虚拟头节点 二 数组的随机访问 三 动态数组 链表复杂度分析 四 动态数组 add E element 复杂度分析 五 动态数组的缩容 一 虚拟头节点 为了让代码更加精简 统一所有节点的处理逻辑 可以在最前面增加一个虚拟的头节点
  • mybatis-plus设置主键自增 ,获取自增主键id

    第一步 实体类加注解 在主键上加 TableId type IdType AUTO 注解 第二步 在数据库设置主键自增 第二种 可以在mapper插入标签中添加keyProperty id useGeneratedKeys true
  • Courses

    点击打开链接 Problem Description Consider a group of N students and P courses Each student visits zero one or more than one co
  • 网络编程-----socket函数

    1 Socket 函数 访问底层操作系统接口的全部方法 提供服务中心类 简化网络服务器的开发 语法 socket socket family type proto family 套接字家族可以是 AF UNIX 或者 AF INET typ
  • Vue.js 2 渐进式前端框架 的最佳学习方法

    Vue js作为一个后起的前端框架 借鉴了Angular React等现代前端框架 库的诸多特点 并且 取得了相当不错的成绩 Vue js的定位是一个渐进式框架 作者的说法是 与其他框架的区别就是渐进式的想法 也就是Progressive
  • 转:Python2字符编码问题汇总

    这篇文章的部分问题在Python3以后不再存在 老猿只是觉得文章的部分内容还是有参考价值 因此在此原文转发连接 Python2字符编码问题汇总
  • 第三章——Lyapunov理论基础

    文章目录 3 1 非线性系统和平衡点 非线性系统 自治与非自治系统 平衡点 常规运动 3 2 稳定性的概念 稳定性与非稳定性 渐进稳定性和指数稳定性 局部和全局稳定性 3 3 线性化和局部稳定性 3 4 Lyapunov直接法 正定函数和L
  • python的高级变量类型

    1 Python 中数据类型可以分为 数字型 和 非数字型 数字型 整型 int 浮点型 float 布尔型 bool 真 True 非 0 数 非零即真 假 False 0 复数型 complex 主要用于科学计算 例如 平面场问题 波动
  • (C语言)关于浮点数和0比较大小

    对于浮点数a 不能用if a 0 来判断a与0的大小 应该判断a是否位于0附近的一个很小的区间 EPS EPS 中 或者说a的绝对值小于等于一个很小的数EPS 可定义EPS 1e 6 即用if fabs a lt EPS 正确的实数与0的比
  • 【PHP基础知识】——操作Email

    邮件已经成为我们生活中不可或缺的信息沟通方式 时常需要我们去群发或者定时发送一下邮件给指定对象 例如系统的故障报警邮件 批量回复一些服务信息等 因此 将发送邮件功能做到后台可配置或者自动化是程序开发的重要部分 像Java等语言一样 下面我们
  • 看完这篇 教你玩转渗透测试靶机Vulnhub——DriftingBlues-2

    Vulnhub靶机DriftingBlues 1渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机漏洞详解 信息收集 暴力破解 漏洞利用 反弹shell nmap提权 获取flag Vulnhub靶机渗透总结
  • docker 端口映射错误解决方法

    COMMAND FAILED sbin iptables t nat A DOCKER p tcp d 0 0 dport 8111 j DNAT to destination 172 17 0 6 8111 i docker0 faile
  • [Android] 底部菜单布局+PopupWindows实现弹出菜单功能(初级篇)

    这篇文章主要是自己研究如何对底部菜单进行布局 并简单的实现点击不同 按钮 实现图片切换和背景切换的功能 最后通过PopupWindows实现弹出菜单 点击不同按钮能实现不同方法 相当于美图秀秀编辑图片的功能吧 它并没有涉及到Fragment
  • c++ 函数指针

    函数指针基础 1 获取函数的地址 2 声明一个函数指针 3 使用函数指针来调用函数 获取函数指针 函数的地址就是函数名 要将函数作为参数进行传递 必须传递函数名 声明函数指针 声明指针时 必须指定指针指向的数据类型 同样 声明指向函数的指针
  • 【Redis】深入理解 Redis 事务机制

    文章目录 前言 一 回顾 MySQL 事务 1 1 MySQL 事务的概念与特性 1 1 MySQL 事务的管理 二 对 Redis 事务的认识 2 1 什么是 Redis 的事务 2 1 1 Redis 事务的概念 2 1 2 对 Red
  • 虚拟机 Linux 系统自定义桌面分辨率且重启后保持不变

    这是原先写在博客园的 原标题为 Linux Ubuntu 虚拟机系统自定义桌面分辨率且重启后保持不变 现在做部分修改 适用于 Debian 系发行版 我用 VMware Workstation 12 Pro 安装的 Ubuntu MATE
  • 计算机图形学 期末复习 微课版 孔令德 七、建模与消隐 期末复习

    计算机中三维物体的表示有线框模型 表面模型和实体模型3种方法 模型的数据结构 三表结构 立方体的点表 顶点 x坐标 y坐标 z坐标 P0 X0 1 Y0 0 Z0 0 P1 X1 1 Y1 0 Z1 0 P2 X2 1 Y2 1 Z2 0
  • SpringBoot结合Eureka,配置服务端

    场景 为了对单一项目进行拆分 需要模块相互远程调用 负载均衡和限流 进而引入eureka 难点 1 springboot和springcloud版本对应关系 2 父子项目maven关系梳理 完成代码 1 父项目pom文件 creatived
  • DSB Security 如何优雅的进行敏感数据的传输?

    DSB Security 如何优雅的进行敏感数据的传输 对于项目中的敏感数据处理 很多同学刚开始接触的时候 往往觉得比较繁琐 项目中实现的方式也是千奇百怪 基本就是百度搜索和粘贴 对于敏感数据的处理 是任何一家互联网公司必须要注重的事情 用
  • OPENGL知识点整理(一)

    OPENGL知识点整理 一 概述内容为阅读相关博主文档后整理 因此 相当部分的内容直接引用自如下链接 https www jianshu com p 5da5a17ad5cb https blog csdn net u012861978 a