OpenGL 的内置矩阵种种

文章目录

  • 一、说明
  • 二、glMatrixMode的三个选项
  • 三、OpenGL 矩阵操作
  • 四、入栈和弹出矩阵
  • 五、设置内置 OpenGL 矩阵
  • 六、矩阵设置异端
  • 七、正常矩阵

一、说明

   内置 OpenGL有几个重要矩阵,围绕这几个矩阵,OpenGL 有一小组 矩阵操作。在本例中为 glMatrixMode,这是非常有用的例程。

二、glMatrixMode的三个选项

   实际上,只有三件事可以传递给 glMatrixMode:

  • glMatrixMode(GL_MODELVIEW);是常见的情况。 这使得所有后续矩阵操作都会影响 “gl_ModelViewMatrix”,主要用于模型设置(用于 例如,缩小汽车模型以适合建筑模型旁边)。
  • glMatrixMode(GL_PROJECTION);切换到 投影矩阵,“gl_ProjectionMatrix”。投影矩阵的 工作平时是进行透视分割,但实际上我经常 将其用于整个相机变换;基本上是 ViewProjection 而不仅仅是投影。
  • glMatrixMode(GL_TEXTURE);切换到纹理 矩阵。这可用于调整纹理坐标 传入。使用可编程硬件,通常更容易 自己调整gl_MultiTexCoord0。

   固定功能硬件实质上在每个顶点上执行以下 GLSL 代码:
   其他一切实际上只是约定俗成的问题。
gl_Position = gl_ProjectionMatrixgl_ModelViewMatrixgl_Vertex;

三、OpenGL 矩阵操作

   OpenGL 有一大堆有用的实用程序例程,它们作用于当前矩阵(由 glMatrixMode 设置):

  • glLoadIdentity();清除当前矩阵,将其替换为恒等式,如“M=mat4(1.0);”。
  • glMultMatrixf(&newMat[0][0]);将当前矩阵乘以新的列矩阵,将“M”替换为“M*newMat”。适用于 C++ mat4 对象。
  • glTranslatef(dx,dy,dz); 移动当前坐标系的原点。
  • glScalef(sx,sy,sz);缩放当前坐标系。按大值扩展 让东西变大。您还可以通过缩放 负值。
  • glRotatef(ang,x,y,z);围绕向量 x,y,z 右旋 ang 度旋转。为 例如,glRotatef(45.0,0,0,1);将屏幕上的内容旋转 45 度逆时针方向。
       还有很多其他的例程。您还可以提取矩阵值并根据需要手动操作它们:
mat4 p; /* stores the Projection matrix */
glGetFloatv(GL_PROJECTION_MATRIX,&p[0][0]); /* read back the projection matrix */
mat4 t=mat4(1.0); /* soon to be a Translation matrix */
t[3].z += dz; /* set translation offset */
p=p*t; /* multiply projection matrix by translation matrix */
glLoadMatrixf(&p[0][0]); /* copy new matrix into OpenGL */

四、入栈和弹出矩阵

   OpenGL 矩阵最酷的地方是推送和弹出。 比方说,要画出你世界的一小块,你需要翻译 并缩放坐标系。然后画一些其他的棋子, 您需要返回原始坐标系,并进行平移 并以不同的方式扩展。OpenGL 使用 glPushMatrix 使这一切变得简单 和 glPopMatrix,它将当前矩阵保存到一点 OpenGL 内部堆栈。
   在这段代码之后,矩阵保持不变。没有 推送和弹出,您将被 model1.origin + model2.origin 翻译。

glPushMatrix(); /* save old coordinate system */
glTranslatef(model1.origin.x,model1.origin.y,model1.origin.z);
model1.draw();
glPopMatrix(); /* restore old coordinate system */

五、设置内置 OpenGL 矩阵

   初始化内置 OpenGL 矩阵的常用方法是使用 每帧开头的一小段代码,在“显示”中 常规。你至少要建立透视分界线 和相机方向。我的矩阵设置代码通常如下所示 this:
以每个 MatrixMode 的 glLoadIdentity 开始每一帧非常重要,因为:

// Load all needed matrices into OpenGL:
glMatrixMode(GL_PROJECTION);
glLoadIdentity(); /*<- clean out any old leftover matrices */
gluPerspective(90.0, /* <- Y camera field-of-view, in degrees */win_w/(float)win_h, /* viewport's aspect ratio: always width over height */0.01, /* Near clipping plane depth */100.0 /* Far clipping plane depth */
);
/* if you're not Dr. Lawlor, you'd switch to GL_MODELVIEW here */
glTranslatef(0,0,-2.0); /* push world origin down the *unrotated* Z axis */
glMultMatrixf(&viewMat[0][0]); /* camera orientation: can also go under GL_MODELVIEW */glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

   OpenGL 不会在每一帧之后重置矩阵,因此很容易得到可怕的奇怪矩阵,在那里你一遍又一遍地进行透视划分。(试试这个!太可怕了!
MPIglut(我们将在 2 月份讨论)覆盖 glLoadIdentity 以添加其子窗口矩阵。

六、矩阵设置异端

   有些人喜欢将GL_PROJECTION设置放在重塑中 常规。这是一个坏主意,因为某些版本的 GLUT 没有 调用 Reshape 例程,直到窗口实际重塑。 此外,这使得动画制作变得更加棘手,例如相机 视场。

   其他人更喜欢只把视角鸿沟放在 GL_PROJECTION矩阵。此方法适用于固定函数 硬件的(丑陋得可怕)每个顶点照明,用于镜面反射 照明假设后GL_MODELVIEW摄像机位于原点 (固定功能照明发生在眼睛空间中)。同样,使用 可编程着色器,你可以做任何你喜欢的事情——我喜欢做 世界空间中的照明,如果整个相机最容易 转换在GL_PROJECTION矩阵中。

   所以我有点像矩阵异端——我对待GL_MODELVIEW和 GL_PROJECTION就像他们实际上是GL_MODEL和 GL_VIEWPROJECTION。这意味着我的矩阵不适用于 固定功能 OpenGL 镜面光源,使用起来既笨重又 丑。由于我更喜欢每像素镜面反射照明,所以我不喜欢 请注意这一点。

七、正常矩阵

   普通人很有趣。它们是 vec3 的,因为你不想要 对法线的看法。而且它们实际上并没有完全扩展 右图 - 具有 45 度法线的 45 度曲面,由 glScalef(1,0.1,1) 将曲面降低到接近 0 度,但 实际上将法线向上倾斜,方向与 表面,接近 90 度。

   从数学上讲,如果在表面上的两点 a 和 b 之间, dot(n,b-a)==0,则在将矩阵 M 应用于点后,您需要 法线仍然是垂直的。问题是,什么 矩阵 N 您是否必须应用于法线才能实现这一点? 换句话说,找到 N 使得

  dot( N * n , M * a - M * b) == 0

   我们可以通过注意到点积可以表示为矩阵来解决这个问题 乘法–dot(x,y) = transpose(x) * y,其中我们处理一个普通的 column-vector 作为一个小矩阵,并水平翻转它。所以

  transpose(N * n) * (M*a - M*b) == 0         (as above, but write using transpose and matrix multiplication)transpose(N * n) * M * (a-b) == 0              (collect both copies of M)transpose(n) * transpose(N) * M * (a-b) == 0    (transpose-of-product is product-of-transposes in opposite order)

   好的。这确实类似于我们假设原始法线垂直于表面——即:

dot(n,b-a) == transpose(n) * (a-b) == 0

   事实上,唯一的区别是楔入中间的新矩阵。如果我们选择 N 使中间的项成为恒等式,那么我们的新法线也将垂直于表面:

 transpose(N) * M == I   (the identity matrix)

   这是矩阵逆矩阵的定义,因此“正常矩阵”

N = transpose(inverse(M)).

   如果您查找“gl_NormalMatrix”的 GLSL 定义,它被定义为“gl_ModelViewMatrix 的逆矩阵的转置”。现在你知道为什么了!

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

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

相关文章

人工智能|推荐系统——工业界的推荐系统之概要

以小红书为例的推荐系统的转化流程&#xff0c;用户看到内容就是曝光&#xff0c;可以点击进去&#xff0c;然后进行一些“交互”行为&#xff0c;比如评论、点赞、收藏、转发。 通常会考虑用户的一些消费指标 而从推荐系统的角度则会考虑一些北极星指标&#xff0c;也就是优化…

微信小程序demo-----制作文章专栏

前言&#xff1a;不管我们要做什么种类的小程序都涉及到宣传或者扩展其他业务&#xff0c;我们就可以制作一个文章专栏的页面&#xff0c;实现点击一个专栏跳转到相应的页面&#xff0c;页面可以有科普类的知识或者其他&#xff0c;然后页面下方可以自由发挥&#xff0c;添加联…

OBD读取车辆里程数

OBD(On-Board Diagnostics)系统可以通过车辆的OBD接口读取多种车辆数据,但关于里程数的读取,情况稍微复杂一些。以下是关于通过OBD读取车辆里程数的详细解释: OBD输出信息中与里程相关的数据: 在标准的OBD输出信息中,并不直接提供车辆的总里程数。它主要提供的是与故障相…

spring boot学习第十八篇:使用clickhouse

1、pom.xml文件内容如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://…

ConcurrentLinkedQueue 原理

文章目录 1. 模仿 ConcurrentLinkedQueue 1. 模仿 ConcurrentLinkedQueue ConcurrentLinkedQueue 的设计与 LinkedBlockingQueue 非常像&#xff0c;也是 两把【锁】&#xff0c;同一时刻&#xff0c;可以允许两个线程同时&#xff08;一个生产者与一个消费者&#xff09;执行…

Node.js -- MongoDB

文章目录 1. 相关介绍2. 核心概念3. 命令行交互3.1数据库命令3.2 集合命令3.3 文档命令 4. 数据库应用场景4.1 新增4.2 删除4.3 更新4.4 查询 5. 图形化工具Robo 3T 1. 相关介绍 一、简介 Mongodb是什么 MongoDB是一个基于分布式文件存储的数据库&#xff0c;官方地址https://…

深入图像分类:使用美国手语数据集训练定制化神经网络

引言 在前一篇博客中&#xff0c;我们探讨了如何使用MNIST数据集训练一个基础的神经网络来进行手写数字识别。在本文中&#xff0c;我们将更进一步&#xff0c;使用美国手语字母表&#xff08;ASL&#xff09;数据集来构建一个定制化的图像分类模型。通过这个过程&#xff0c;…

[嵌入式系统-53]:嵌入式系统集成开发环境大全 ( IAR Embedded Workbench(通用)、MDK(ARM)比较 )

目录 一、嵌入式系统集成开发环境分类 二、由MCU芯片厂家提供的集成开发工具 三、由嵌入式操作提供的集成开发工具 四、由第三方工具厂家提供的集成开发工具 五、开发工具的整合 5.1 Keil MDK for ARM 5.2 IAR Embedded Workbench&#xff08;通用&#xff09;、MDK&…

EasyRecovery2024汉化版电脑数据恢复软件下载

EasyRecovery是一款功能强大的数据恢复软件&#xff0c;其主要功能包括但不限于以下几点&#xff1a; 硬盘数据恢复&#xff1a;能够扫描本地计算机中的所有卷&#xff0c;建立丢失和被删除文件的目录树&#xff0c;实现硬盘格式化、重新分区、误删数据、重建RAID等硬盘数据恢…

欧拉回路(leetcode 重新安排行程)

先学习一下欧拉回路是怎么一回事。 对于图中这七个节点&#xff0c;从节点1出发&#xff0c;最终要到达节点1&#xff0c;并且每条路只能走一次&#xff0c;且每条路都得走过一次。 使用dfs&#xff0c;如果算法按照字典序的排列方式选择下一个节点。 第一部分&#xff1a;那…

解救应用启动危机:Spring Boot的FailureAnalyzer机制

目录 一、走进FailureAnalyzer 二、在Spring Boot中如何生效 三、为什么可能需要自定义FailureAnalyzer 四、实现自定义基本步骤 &#xff08;一&#xff09;完整步骤要求 &#xff08;二&#xff09;注册方式说明 通过Spring Boot的spring.factories文件&#xff08;建…

ChatGPT等AI大模型输出格式错误优化分享

#ChatGPT/坑 当 ChatGPT没有按照要求的格式输出 省时间&#xff0c;直接上结论 切换模型也不太好使&#xff0c;捕获异常回调重试发送提示词也不太好使。 原因是相同的提示词会触发类似 “缓存” 的东西持续输出错误的结果&#xff0c;至上与上次输出的 70% 都是相同的&…

EMP.DLL是什么东西?游戏提示EMP.DLL文件缺失怎么解决

emp.dll文件是Windows操作系统中的一种动态链接库文件&#xff0c;它被设计为可以被多个程序共享使用的模块化文件。这种设计旨在提高系统效率&#xff0c;减少内存消耗&#xff0c;并简化软件的维护和更新。DLL文件通常包含了一系列相关的函数和变量&#xff0c;这些函数和变量…

基于java,SpringBoot和VUE的求职招聘简历管理系统设计

摘要 基于Java, Spring Boot和Vue的求职招聘管理系统是一个为了简化求职者与雇主间互动流程而设计的现代化在线平台。该系统后端采用Spring Boot框架&#xff0c;以便快速搭建具有自动配置、安全性和事务管理等特性的RESTful API服务&#xff0c;而前端则使用Vue.js框架构建动…

使用unreal engine5.3.2创建c++第一人称游戏

UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法&#xff1a; 前言 为了使用unreal engine5.3.2创建c第一人称游戏&#xff0c;今天安装了Visual Studio 2022专业版。在ue5中创建c工程&#xff0c;结果编译器报错&#xff1a; 严重性 代码 说明 项目…

UE5入门学习笔记(六)——编译低版本插件

对于有些低版本的插件&#xff0c;可以通过此方法自己编译到高版本而无需等待插件作者更新 使用工具&#xff1a;如图所示 步骤1&#xff1a;打开cmd&#xff0c;并使用cd命令切换到此目录 步骤2&#xff1a;输入如下指令 RunUAT.bat BuildPlugin -Plugin“路径1” -Package“…

06 - metastore服务、hive服务启动脚本以及相关使用技巧

目录 1、metastore服务 1.1、metastore运行模式 1.2、metastore部署 1.3、测试 2、编写Hive服务启动脚本 3、Hive使用技巧 3.1、Hive常用交互命令 3.2、Hive参数配置方式 3.3、Hive常见属性配置 1、metastore服务 Hive的metastore服务的作用是为Hive CLI或者Hiveserv…

MYSQL数据库专业术语及创建数据表详细讲解[详细版]{sql语句创建数据库语句及条件子句解析,编码格式解析,创建数据表解析,表定义字段解析,主键约束解析}

MYSQL数据库中的专业术语 数据库&#xff08;Database&#xff09;&#xff1a;存储数据的集合&#xff0c;是数据的逻辑容器。 表&#xff08;Table&#xff09;&#xff1a;数据库中存储数据的结构&#xff0c;由行&#xff08;记录&#xff09;和列&#xff08;字段&#x…

【深度学习基础(2)】深度学习之前:机器学习简史

文章目录 一. 深度学习的起源1. 概率建模--机器学习分类器2. 早期神经网络--反向传播算法的转折3. 核方法 -- 忽略神经网络4. 决策树、随机森林和梯度提升机5. 神经网络替代svm与决策树 二. 深度学习与机器学习有何不同 可以这样说&#xff0c;当前工业界所使用的大部分机器学习…

云原生Kubernetes: K8S 1.29版本 部署Harbor

目录 一、实验 1.环境 2.Linux 部署docker compose 3.证书秘钥配置 4.K8S 1.29版本 部署Harbor 5.K8S 1.29版本 使用Harbor 二、问题 1.docker 登录harbor失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.2…