opengl 学习(六)-----坐标系统与摄像机

news2024/11/13 8:52:13

坐标系统与摄像机

  • 分类
  • 引言
  • 坐标系统
  • 摄像机
  • 教程
  • 在CMake中使用全局定义预编译宏,来控制是否开启错误检查
  • 补充

分类

opengl c++

引言

OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说,每个顶点的x,y,z坐标都应该在-1.0到1.0之间超出这个坐标范围的顶点都将不可见
我们通常会自己设定一个坐标的范围,之后再在顶点着色器中将这些坐标变换为标准化设备坐标。然后将这些标准化设备坐标传入光栅器(Rasterizer),将它们变换为屏幕上的二维坐标或像素。

将坐标变换为标准化设备坐标,接着再转化为屏幕坐标的过程通常是分步进行的
在这个工程中,物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System):
将物体的坐标变换到几个过渡坐标系(这样的优点在于,在这些特定的坐标系统中,一些操作或运算更加方便和容易)

对我们来说比较重要的总共有5个不同的坐标系统:
局部空间(Local Space,或者称为物体空间(Object Space))
世界空间(World Space)
观察空间(View Space,或者称为视觉空间(Eye Space))
裁剪空间(Clip Space)
屏幕空间(Screen Space)
这就是一个顶点在最终被转化为片段之前需要经历的所有不同状态。

为了将坐标从一个坐标系变换到另一个坐标系,我们需要用到几个变换矩阵,最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space),在这里它称为局部坐标(Local Coordinate),它在之后会变为世界坐标(World Coordinate),观察坐标(View Coordinate),裁剪坐标(Clip Coordinate),并最后以屏幕坐标(Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么:
在这里插入图片描述

局部坐标是对象相对于局部原点的坐标,也是物体起始的坐标
下一步是将局部坐标变换为世界空间坐标,世界空间坐标是处于一个更大的空间范围的。这些坐标相对于世界的全局原点,它们会和其它物体一起相对于世界的原点进行摆放。
接下来我们将世界坐标变换为观察空间坐标,使得每个坐标都是从摄像机或者说观察者的角度进行观察的。
坐标到达观察空间之后,我们需要将其投影到裁剪坐标。裁剪坐标会被处理至==-1.0到1.0的范围内,并判断哪些顶点将会出现在屏幕上==。
最后,我们将裁剪坐标变换为屏幕坐标,我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换 将位于-1.0到1.0范围的坐标 变换到 由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器,将其转化为片段。

哦,所以说,glViewport函数的作用就是将裁剪后的坐标变换为屏幕坐标,下次你再遇到的时候就应该了解这个函数了。

其实耐心去看的话,是能看懂的,但是工作中总是很心急,想快点做出效果,结果就是遗漏了重要的知识点,现在第二遍我才看到这个。

我们之所以将顶点变换到各个不同的空间的原因是有些操作在特定的坐标系统中才有意义且更方便。

好好理解下面这个例子:
例如,
当需要对物体自身进行修改的时候(比如星球自转),在局部空间中来操作会更说得通
如果要对一个物体做出一个相对于其它物体位置的操作时(比如绕着一个东西进行旋转),在世界坐标系中来做这个才更说得通,等等。

接下来我们将要更仔细地讨论各个坐标系统。

坐标系统

坐标标准化处理

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

x = (event.pos().x   - this->width/2) / this->width/2;
y = - (event.pos().y   - this->height/2) / this->height/2;

摄像机

明确一点:
OpenGL本身没有摄像机(Camera)的概念
但我们可以通过把场景中的所有物体往相反方向移动的方式来模拟出摄像机,产生一种我们在移动的感觉,而不是场景在移动。

不要忘记正z轴是从屏幕指向你的,如果我们希望摄像机向后移动,我们就沿着z轴的正方向移动。

教程

https://learnopengl-cn.github.io/01%20Getting%20started/08%20Coordinate%20Systems/

在CMake中使用全局定义预编译宏,来控制是否开启错误检查

这个好厉害:opengl的错误检查

https://www.bilibili.com/video/BV1EZ4y1n72m/?p=21&spm_id_from=pageDriver
在这里插入图片描述

补充

在这里插入图片描述

__FILE____LINE__
它们会在编译的时候被替换成编译时对应的文件与行号。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <assert.h>
void checkErroe()
{
	GLenum errorCode = glGetError();
	std::string error = "";
	if(errorCode != GL_NO_ERROR){
		switch(errorCode){
			case GL_INVALID_ENUM: error = "INVALID_ENUM"; break;
			case GL_INVALID_VALUE: error = "GL_INVALID_VALUE"; break;
			case GL_INVALID_OPEATION: error = "GL_INVALID_OPEATION"; break;
			case GL_OUT_OF_MEMORY: error = "GL_OUT_OF_MEMORY"; break;
			default:
				error = "UNKOWN";
				break;
		}
		std::cout<<error<<std::endl;
		asssert(false);//断言,一但出现错误,就让程序暂停
	}
}

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

感觉还是看视频效率高些,看书看不进去,红红火火哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈

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

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

相关文章

电脑数字键盘充当上下左右键怎么解决

搜索鼠标键把下面这个按钮关掉就好了

垃圾回收-垃圾回收中的相关概念

目录 System.gc()的理解 内存泄漏&#xff08;Memory Leak&#xff09; 内存溢出&#xff08;OOM&#xff09; Stop The World 垃圾回收的串行、并行与并发 安全点与安全区域 强、软、弱、虚引用 强、软、弱、虚引用 终结器引用 System.gc()的理解 在默认情况下&#…

【项目】基于YOLOv8和RotNet实现圆形滑块验证码(拼图)自动识别(通过识别中间圆形的角度实现)

TOC 一、引言 1.1 实现目标 要达到的效果是使用算法预测中间圆形的角度&#xff0c;返回给服务器&#xff0c;实现自动完成验证码的问题。要实现的内容如下图所示。 1.2 实现思路 思路1&#xff08;效果较差&#xff09;&#xff1a;以RotNet要实现的验证码识别为灵感&…

【技术栈】Redis 的理解与数据存储格式

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;学习技术栈 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8; 友情提供 目录 相关传送门 1. NOSQL和关系型数据库比较 2. 主流的NOSQL产品 3. Redis的理解 4. redis数据存储格式…

Golang标准库fmt深入解析与应用技巧

Golang标准库fmt深入解析与应用技巧 前言fmt包的基本使用打印与格式化输出函数Print系列函数格式化字符串 格式化输入函数小结 字符串格式化基本类型的格式化输出自定义类型的格式化输出控制格式化输出的宽度和精度小结 错误处理与fmt使用fmt.Errorf生成错误信息fmt包与错误处理…

vue/vite添加地图

最简单的方式&#xff0c;不论vue2、vue3、vite均适用&#xff0c;例如以高德为例&#xff1a; index.html 引入 <scriptsrc"https://webapi.amap.com/maps?v1.4.15&key您的key&pluginAMap.ToolBar,AMap.MouseTool,AMap.DistrictSearch,AMap.ControlBar&quo…

filezilla客户端的应用以及ftplftpwget的用法

filezilla的应用 用户的配置查看上一篇文章FTP3种用户的配置 进入filezilla软件测试 用yy用户登录发现可以上传下载创建删除 再用cc用户登录发现不能上传不能删除不能创建只能下载 ftp&lftp&wget客户端的应用 以命令行的方式连接ftp&#xff0c;一般只会用到上…

MAC废纸篓删掉还能复原吗 MAC废纸篓倾倒掉的文件怎么恢复 删除的东西在哪里可以找回来 怎么找回已删除的文件

MAC系统中的废纸篓&#xff08;Trash&#xff09;通常指用来临时存放用户即将丢弃的文件的地方。MAC系统的废纸篓功能相当于Windows系统的垃圾回收站&#xff0c;通过废纸篓删除的文件&#xff0c;一般是无法从系统中操作还原。那么&#xff0c;MAC废纸篓删掉还能复原吗&#x…

Linux系统(四)- 进程初识 | 环境变量 | 进程地址空间

~~~~ 前言冯诺依曼体系结构&#xff08;重要&#xff09;总览CPU工作方式什么是指令集&#xff1f;CPU为什么只和内存打交道&#xff08;数据交换&#xff09;&#xff1f;木桶效应&#xff1a;在数据层面的结论程序运行为什么要加载到内存&#xff1f; 进一步理解计算机体系结…

应用APM-如何配置Prometheus + Grafana监控springboot应用

文章目录 概述在Spring Boot应用中集成Micrometerspringboot配置修改 Docker安装Prometheus和Grafanaprometheus配置grafana配置启动Prometheus和Grafana在Grafana中配置数据源创建Grafana仪表盘配置Grafana告警&#xff08;可选&#xff09;监控和分析 概述 配置Prometheus和…

NASA数据集——2017 年来自 Arctic-CAP 的大气中 CO、CO2 和 CH4 浓度剖面图

简介 ABoVE: Atmospheric Profiles of CO, CO2 and CH4 Concentrations from Arctic-CAP, 2017 文件修订日期&#xff1a;2019-05-01 数据集版本: 1 数据集摘要 本数据集提供了 2017 年 4 月至 11 月北极碳飞机剖面&#xff08;Arctic-CAP&#xff09;月度采样活动期间阿拉…

MIT的研究人员最近开发了一种名为“FeatUp”的新算法,这一突破性技术为计算机视觉领域带来了高分辨率的洞察力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【冥想X理工科思维】场景10:长期项目的焦虑和压力

冥想音频合集&#xff1a;职场解压冥想音频 压力场景&#xff1a; 在长期项目中&#xff0c;如何定期冥想帮我保持耐心和持久性&#xff1f; 点击看大图&#xff1a; 详细说明&#xff1a;通过这个冥想流程&#xff0c;你可以帮助自己在长期项目中保持耐心、坚持和放松的状态。…

SAP前台处理:物料主数据创建<MM01>之会计视图

一、背景&#xff1a; 终于来到了物料主数据&#xff0c;我觉得物料账是SAP最重要的一项发明&#xff0c;也一直是SAP的一项重要优势&#xff0c;物料账记录了一个个物料的生生不息&#xff1b; 本章主要讲解物料主数据和财务相关的主要内容&#xff1a;这里特别提示由于作者…

类和对象-4

文章目录 前言const成员函数取地址及const取地址操作符重载构造函数续explicit static成员友元内部类匿名对象 前言 在前面的文章中&#xff0c;我们了解到了类的四个默认成员函数&#xff1a;构造、析构、拷贝构造和赋值重载。接下来我们会继续学习剩下的两个默认成员函数以及…

CAD建筑版2024 安装教程

CAD建筑版是一种专门用于建筑设计和绘图的CAD软件版本。它提供了专业的建筑设计工具和功能&#xff0c;帮助建筑师、设计师和工程师在建筑领域进行快速、准确和高效的设计工作。 CAD建筑版具备建筑相关的库和元素&#xff0c;用户可以方便地使用预定义的建筑符号和元素进行建筑…

二叉树|104.二叉树的最大深度 111.二叉树的最小深度

104.二叉树的最大深度 力扣题目链接 class solution { public:int getdepth(TreeNode* node) {if (node NULL) return 0;int leftdepth getdepth(node->left); // 左int rightdepth getdepth(node->right); // 右int depth 1 max(leftdepth, rightdepth…

嵌入式-4种经典继电器驱动电路-单片机IO端口/三极管/达林顿管/嵌套连接

文章目录 一&#xff1a;继电器原理二&#xff1a;单片机驱动电路三&#xff1a;经典继电器驱动电路方案3.1 继电器驱动电路方案一&#xff1a;I/O端口灌电流方式的直接连接3.1.1 方案一的继电器特性要求3.1.2 方案一可能会损坏I/O口 3.2 继电器驱动电路方案二&#xff1a;三极…

记录一次基于AES加密的恶意软件逆向分析和解密过程(含文件)

导入(Imports)和字符串 首先,用IDA或Ghidra加载文件test.dat,文件为64位文件 IDA点击View==>Open subviews==>Imports,查看导入信息 Ghidra可以直接看到 可以看到,导入函数有: __printf_chk, malloc, __isoc99_sscanf, putchar, __stack_chk_fail, __cxa_fina…

安捷伦Agilent E8361C网络分析仪

181/2461/8938产品概述&#xff1a; 安捷伦e 8361 c网络分析仪提供通用网络分析&#xff0c;可选软件和/或硬件为您的应用定制-如多端口、脉冲射频等。 安捷伦E8361C网络分析仪的显示窗口数量不限&#xff0c;可以调整大小和重新排列&#xff0c;每个窗口最多有24条活动轨迹和…