眼睛空间坐标到底是什么?

2023-12-02

当我学习 OpenGL 时,我经常偶然发现所谓的眼空间坐标。

如果我是对的,你通常有三个矩阵。模型矩阵、视图矩阵和投影矩阵。虽然我不完全确定其背后的数学原理是如何工作的,但我确实知道将坐标转换为世界空间、视图空间和屏幕空间。

但是眼睛空间在哪里,我需要哪些矩阵将某些内容转换为眼睛空间?


Perhaps the following illustration showing the relationship between the various spaces will help:The OpenGL transformation pipeline

取决于您是否使用固定功能管道(如果您调用glMatrixMode(),例如),或者使用着色器,操作是相同的 - 只是您是否直接在着色器中编码它们,或者 OpenGL 管道辅助您的工作的问题。

虽然人们不喜欢讨论固定功能管道的问题,但它使对话变得更简单,所以我将从这里开始。

在旧版 OpenGL(即 OpenGL 3.1 之前的版本,或使用兼容性配置文件)中,定义了两个矩阵堆栈:模型视图, and 投影,当应用程序启动时,每个堆栈顶部的矩阵是单位矩阵(对角线上为 1.0,所有其他元素为 0.0)。如果您在该空间中绘制坐标,那么您实际上是在渲染标准化设备坐标(NDC),它会剪掉 X、Y 和 Z 中 [-1,1] 范围之外的任何顶点。视口变换(通过调用设置glViewport())是将 NDC 映射到窗口坐标(实际上是视口坐标,但大多数情况下视口和窗口的大小和位置相同),以及深度值深度范围(默认为 [0,1])。

Now, in most applications, the first transformation that's specified is the projection transform, which come in two varieties: orthographic and perspective projections. An orthographic projection preserves angles, and is usually used in scientific and engineering applications, since it doesn't distort the relative lengths of line segments. In legacy OpenGL, orthographic projections are specified by either glOrtho or gluOrtho2D. More commonly used are perspective transforms, which mimic how the eye works (i.e., objects far from the eye are smaller than those close), and are specified by either glFrustum or gluPerspective. For perspective projections, they defined a viewing frustum, which is a truncated pyramid anchored at the eye's location, which are specified in eye coordinates. In eye coordinates, the "eye" is located at the origin, and looking down the -Z axis. Your near and far clipping planes are specified as distances along the -Z axis. If you render in eye coordinates, any geometry specified between the near and far clipping planes, and inside of the viewing frustum will not be culled, and will be transformed to appear in the viewport. Here's a diagram of a perspective projection, and its relationship to the image plane Viewing frustum.

眼睛位于视锥体的顶点。

最后要讨论的转换是模型视图变换,它负责移动坐标系(而不是对象;稍后会详细介绍),以便它们相对于眼睛和视锥体处于良好的位置。常见的建模变换是翻译, scales, 旋转, and shears(OpenGL 没有原生支持)。

一般来说,3D 模型是围绕局部坐标系建模的(例如,指定以原点为中心的球体坐标)。建模变换用于将“当前”坐标系移动到新位置,以便在渲染本地建模对象时,它位于正确的位置。

建模变换和查看变换之间没有数学差异。通常,建模变换用于特定模型并由glPushMatrix() and glPopMatrix()操作,通常首先指定查看变换,并影响所有后续建模操作。

现在,如果您正在执行这种现代 OpenGL(核心配置文件版本 3.1 及更高版本),您必须自己逻辑地执行所有这些操作(您可能只指定一个转换,将模型视图和投影转换折叠为单个矩阵乘法) 。矩阵通常指定为着色器uniforms。没有矩阵堆栈、模型视图和投影转换的分离,并且您需要正确的数学才能模拟管道。 (顺便说一句,透视划分视口变换步骤由 OpenGL 在顶点着色器完成后执行 - 你不需要做数学[你可以,它不会伤害任何东西,除非你未能设置w到 1.0 在你的gl_Position顶点着色器输出)。

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

眼睛空间坐标到底是什么? 的相关文章

  • iOS心率检测算法

    我正在尝试在我正在开发的应用程序中实现心跳记录功能 首选方法是使用 iPhone 的摄像头 在灯亮的情况下 让用户将手指放在镜头上 然后检测视频源中与用户心脏相对应的波动 我通过以下堆栈溢出问题找到了一个非常好的起点here https s
  • 如何找到在matlab中重复的矩阵的每一行的索引?

    我想找到矩阵中所有有重复项的行的索引 例如 A 1 2 3 4 1 2 3 4 2 3 4 5 1 2 3 4 6 5 4 3 要返回的向量将是 1 2 4 很多类似的问题建议使用unique函数 我已经尝试过 但我能得到的最接近我想要的功
  • R矩阵右除

    在 R 中进行左右矩阵除法的最简洁 最快 数值最稳定 最 R 惯用的方法是什么 我理解左除法inv A B通常是用solve a b 但是怎么样B inv A 确实是最好的计算方法t solve t A t B It is B solve
  • Numpy:查找两个 3-D 数组之间的欧几里德距离

    给定两个维度为 2 2 2 的 3 D 数组 A 0 0 92 92 0 92 0 92 B 0 0 92 0 0 92 92 92 如何有效地找到 A 和 B 中每个向量的欧几里得距离 我尝试过 for 循环 但速度很慢 而且我正在按 g
  • Retina 显示屏中具有 QOpenGLWIdget 的 Qt MainWindow 显示错误大小

    我有一个 Qt 应用程序MainWindow 我嵌入一个QOpenGLWidget在里面 一切正常 直到我开始使用 Apple Retina 显示屏并在高 DPI 模式下运行我的应用程序 我的QOpenGLWidget只是它应该具有的大小的
  • OpenGL 缓冲区、glFlush 和 glutSwapBuffers()

    使用之间有什么区别吗 glutInitDisplayMode GLUT SINGLE GLUT RGB with glFlush and glutInitDisplayMode GLUT DOUBLE GLUT RGB with glutS
  • 如何在Android模拟器相机中模拟图片?

    有没有办法将模拟器相机拍摄的照片设置为静态图片 我想在模拟器上使用 zxing 条形码阅读器测试 ir 如果您在 Linux 上运行模拟器 您可以使用 v4l2loopback 和 gstreamer 创建一个显示图像 例如 QRcode
  • SDL 程序中颜色关闭

    我目前正在开发一个非常简单的游戏 使用纯 C 方法和 SDL 及其官方额外库 如 SDL image 和 OpenGL 现在 虽然我遇到了一些障碍 但我不知道为什么要这样做 绘制时颜色全部关闭 我目前在 Mac 上运行该程序 但如果我没记错
  • 当行大小大于向量宽度时 SIMD 转置

    你可以找到很多good https stackoverflow com a 25625919 149138 answers https stackoverflow com a 29587984 149138用于转置一个矩阵 该矩阵落在nat
  • Android webview 允许使用当前 Android Studio 访问相机

    我一直在尝试在我的网络视图上制作一个简单的输入按钮来访问相机和文件 我读过的解决方案各不相同 只有几行代码 没有解释它们到我在 Android Studio 中下载并打开的盲 github 项目链接 Os Fileup 等 的位置 并且它们
  • 矩阵循环移位

    有谁知道对矩阵进行右循环移位的有效方法 顺便说一句 矩阵是二元矩阵 但求解非二元矩阵的方法也很好 现在 我正在考虑为矩阵的行实现一个圆形数组 并在需要移位操作时更新每一行 我正在考虑的另一种方法是实现一个指向由向量表示的列 矩阵 的指针向量
  • (C) 获取矩阵中一行的 3 个最小元素,并随机选择一个

    我有一个 8x8 矩阵 在选择我想要的行后 我想获得它的三个最小元素 并随机选择这三个元素之一 问题是我不知道如何处理这三个要素 我只知道如何获取最小元素 即下面的代码 int piezas 8 8 0 2 2 5 3 2 1 1 0 4
  • 坐标算法 - 绕中心旋转

    通过查看这张图片 我想您会很好地理解我的问题 图片已删除 网址不再有效 现在返回广告 所以基本上我想要一个函数 它接受一个对象作为参数 并根据我之前添加的对象数量为该对象提供正确的坐标 假设我将所有这些对象添加到一个数组中 objectAr
  • OpenGL/GLSL - 纹理过滤的实现

    我想在 GLSL 着色器中自己实现纹理过滤 min 和 magfilter 因为我想使用 image load and store 而不是采样器 而且我想以特殊方式处理未定义的像素 并且我正在寻找一篇文章或者这样讨论过滤过程 我记得如何从我
  • 在 OpenGL 中设置 MVP 矩阵

    我正在尝试学习 OpenGL 的基础知识 但我在设置变换矩阵时遇到问题 我制作了模型 视图和投影矩阵 但将它们发送到我的顶点着色器时遇到问题 这是代码 Set up MVP glm mat4 model glm mat4 GLint uni
  • Android 相机未保存在特定文件夹 [MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA]

    当我在 Intent 中使用 MediaStore INTENT ACTION STILL IMAGE CAMERA 时遇到问题 相机正常启动 但它不会将文件保存在我的特定文件夹 photo 中 但是当我使用 MediaStore ACTI
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • React Native:相机流的多个预览

    我有一个要在 Android 和 iOS 中开发的 React Native 应用程序 我想在其中获取相机流 进行一些处理 然后多次渲染它 想象一下像 Instagram 这样的应用程序 您可以在其中实时向相机添加滤镜 并在实时预览中显示应
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • 透视变换矩阵的计算

    给定 3D 空间中的一个点 如何计算齐次坐标中的矩阵 将该点投影到平面上z d 其中原点是投影中心 好吧 让我们尝试解决这个问题 扩展伊曼纽尔的答案 Assuming如果您的视图向量直接沿着 Z 轴 则所有尺寸都必须按视图平面距离的比例进行

随机推荐

  • ReactJs 产品详细信息页面

    我有一个API与工作Bearer token 我列出了所有三种产品API在产品页面上 我希望能够在我创建的产品项目详细信息页面上单击任何项 目并显示信息 我已成功创建路线 并且可以单击并打开相关页面 现在的问题是使用以下命令在项目详细信息页
  • iOS 和 Android 上的 LLVM 版本

    如何找出 Android NDK 和 Apple Xcode 使用的是哪个 LLVM 版本 检查clang version从 Android NDK r15c 我得到 Android clang version 5 0 300080 bas
  • SQL Server 中多对多层次结构的数据结构

    我的系统中已有以下数据结构 ItemDetails ID Name 1 XXX 2 YYY 3 ZZZ 4 TTT 5 UUU 6 WWW 层次结构位于单独的表中 具有多对多关系 ItemHierarchy ParentCode Child
  • 了解 Android 中的 AudioTrack 断言

    在我的 Android 应用程序中 我使用 AudioTrack API 输出从 RFCOMM 蓝牙连接接收到的音频字节 音频按预期播放并且非常清晰 但是 由于 AudioTrackShared cpp 中的以下断言 应用程序偶尔会崩溃 s
  • 返回一个字符串拆分为 n 个字符串时所有可能的组合

    我在 stackoverflow 上搜索了相关内容 但找不到方法 可能涉及到itertool 我想找到分割字符串的所有可能结果 比如字符串thisisateststring into n 长度相等或不等 无关紧要 两者都应该包含 字符串 例
  • 是否可以在 Dataframe 中使用 Pandas Overlap?

    Python 3 7 熊猫25 我有一个 Pandas Dataframe 其中包含开始日期和结束日期的列 我正在寻找与我的变量范围重叠的范围 在不冗长并用 and or 组成一系列大于 小于语句来过滤出我需要的行的情况下 我想使用某种间隔
  • 如何解决 git-remote-https 的权限被拒绝错误?

    我在尝试使用以下命令克隆 GitHub 存储库时遇到问题 git clone https email protected MYPROJECT git 当我运行它时 我收到此错误 fatal cannot exec git remote ht
  • 在 iOS 上调试 Cordova (PhoneGap) 代码

    我正在开发一个应用程序 我想通过 Cordova PhoneGap 在 iOS 中托管 当我尝试访问 device platform 和 device version 属性时遇到了一些问题 我不确定问题是什么 不管怎样 我不知道如何查看代码
  • 通过网页关闭计算机

    我有一个基于网络的应用程序 它会在由 Windows 7 驱动的客户端计算机上的 chromium Web 浏览器中自动加载到信息亭模式 全屏 我想在网页上放置一个关机按钮 以便用户可以直接关闭计算机 有没有可能实现这一目标 最好的解决方案
  • 使用 PHP 提取 CAB 文件

    在 IIS 6 上运行 PHP 如何打开并提取 CAB 文件的内容 有没有什么方法可以在不使用 exec 的情况下做到这一点 我没有权限用 exec 运行东西 无需外部工具 例如赤霞珠提取物这是行不通的 PHP 没有这方面的函数
  • 从 Linux 连接到 Neo4j 的问题

    尝试从 java 连接到 Neo4j 时出现以下错误 线程 main 中的异常 java lang RuntimeException 启动时出错 org neo4j kernel EmbeddedGraphDatabase data gra
  • 通过azure函数删除CosmosDB中的文档

    阅读 Azure 门户后 我了解了如何制作POST PUT and GET通过 Azure Functions 与 CosmosDB 进行操作 但是删除 我不明白该怎么做 我应该使用哪些绑定 它应该通过 sql 查询还是集合的方法 如Rem
  • 部署 jsp/servlet Web 应用程序时出现 Jboss 错误“com.sun.faces.config.ConfigureListener”错误

    我正在研究 JSP Servlet 该 Web 应用程序将部署在 Jboss 6 上 我正在使用 Java 1 6 Eclipse 和 Maven2 我没有在代码中的任何地方引用 JSF 我的项目在任何地方都没有涉及 JSF 但是当我尝试部
  • 有人可以向我解释以下代码吗?

    我正在阅读 Rails 3 in Action 一书 它正在讨论覆盖to s在模型中 代码如下 def to s email admin Admin User end 我知道在 Ruby 中你可以通过以下方式在双引号内显示 一个值 valu
  • JavaScript 中返回多个值?

    我试图返回两个值JavaScript 这可能吗 var newCodes function var dCodes fg codecsCodes rs var dCodes2 fg codecsCodes2 rs return dCodes
  • 安装 ruby​​ 1.9.3 时出错

    我正在尝试使用 rvm 安装 Ruby 1 9 3 但是 当我输入 rvm install 1 9 3 我收到以下错误 ERROR Error running make please read Users nick rvm log ruby
  • ThreeJS:3D 对象面积计算(三角测量)

    我需要在 ThreeJS 中计算整个对象的面积 表面积 这就是我所拥有的 var len object geometry faces length area 0 0 if len return 0 0 for var i 0 i lt le
  • Jackson注释中的多态性:@JsonTypeInfo用法

    我想知道是否 JsonTypeInfo注解可以用于接口 我有一组应该序列化和反序列化的类 这就是我正在尝试做的事情 我有两个实现类Sub1 Sub2实施MyInt 一些模型类具有实现类型的接口引用 我想基于多态性反序列化对象 JsonTyp
  • 在 Flash 中播放 MIDI 文件

    有没有办法在Flash中播放MIDI文件 使用动作脚本 3 None
  • 眼睛空间坐标到底是什么?

    当我学习 OpenGL 时 我经常偶然发现所谓的眼空间坐标 如果我是对的 你通常有三个矩阵 模型矩阵 视图矩阵和投影矩阵 虽然我不完全确定其背后的数学原理是如何工作的 但我确实知道将坐标转换为世界空间 视图空间和屏幕空间 但是眼睛空间在哪里