openGL 光线拾取

2023-12-26

一般的光线拾取过程应如下(实验结果证明是正确的):

  1. 将屏幕点变换为标准化设备空间方向向量:

    float x = (2.0f * mouse_x) / width - 1.0f;
    float y = 1.0f - (2.0f * mouse_y) / height;
    float z = 1.0f;
    vec3 ray_nds = vec3 (x, y, z);
    
  2. 将方向向量变换为齐次剪切坐标

    vec4 ray_clip = vec4 (ray_nds.xy, -1.0, 1.0);
    
  3. 将方向向量变换为眼空间方向向量

    vec4 ray_eye = inverse (projection_matrix) * ray_clip;
    
  4. 将方向向量变换到世界空间,获得具有世界空间相机位置和方向向量的拾取射线

我的问题是,在标准化设备空间中,为什么方向向量的 z 分量是 1.0? 我的意思是,在OpenGL标准化设备空间中,xyz分量应该都在-1~1的范围内,因此相机应该位于平面z=-1的中心。所以方向向量应该是:视图目标位置-相机位置,z分量应该是1-(-1)=2.0f。 (在 DirectX 标准化设备空间中,xy 分量的范围为 -1~1,z 分量的范围为 0~1,相机位置应位于 z=0 平面的中心,即(0, 0,0),方向向量的z分量应为1-0=1)


ray_nds.z完全无关,因为你无论如何也不会使用它。那是因为你不知道像素的深度。

ray_clip不是方向,而是投影后近裁剪平面(z=-1)上的位置。如果您撤消此投影(使用逆投影矩阵),您最终会在相机空间中得到相同的点。在相机空间中,相机的中心位于(0, 0, 0)。射线的方向矢量可以计算为ray_eye - (0, 0, 0),这本质上是ray_eye。因此,如果我们忽略 w 分量,我们可以使用位置作为方向。这仅适用于相机空间!剪辑空间和世界空间都很可能在其他地方有投影中心。

不要混淆不同空间的摄像机位置。在相机空间中,它位于原点。在剪辑空间中,可以假设位于(0, 0, -infinity)。重点(x, y, ...)只是被相应像素覆盖的任意点。您需要其中任何一个来定义光线。

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

openGL 光线拾取 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • ROWNUM 的 OracleType 是什么

    我试图参数化所有现有的 sql 但以下代码给了我一个问题 command CommandText String Format SELECT FROM 0 WHERE ROWNUM lt maxRecords command CommandT
  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 如何在 WPF RichTextBox 中跟踪 TextPointer?

    我正在尝试了解 WPF RichTextBox 中的 TextPointer 类 我希望能够跟踪它们 以便我可以将信息与文本中的区域相关联 我目前正在使用一个非常简单的示例来尝试弄清楚发生了什么 在 PreviewKeyDown 事件中 我
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • Windows下使用GLEW使用OpenGL扩展

    我一直在 Windows 上使用 OpenGL 扩展痛苦的方式 https stackoverflow com questions 14413 using opengl extensions on windows GLEW 是更简单的方法吗
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 使用安全函数在 C 中将字符串添加到字符串

    我想将文件名复制到字符串并附加 cpt 但我无法使用安全函数 strcat s 来做到这一点 错误 字符串不是空终止的 我确实设置了 0 如何使用安全函数修复此问题 size strlen locatie size nieuw char m
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • GDK3/GTK3窗口更新的精确定时

    我有一个使用 GTK 用 C 语言编写的应用程序 尽管该语言对于这个问题可能并不重要 这个应用程序有全屏gtk window与单个gtk drawing area 对于绘图区域 我已经通过注册了一个刻度回调gtk widget add ti
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co

随机推荐

  • 在构建触发器上使用 Base64 编码值时,cloudbuild.yaml 不会解组

    On my cloudbuild yaml定义 我曾经有一个secrets部分从 Google KMS 获取环境值 这secretEnv字段的键映射到 加密 Base64 编码 值 secrets kmsKeyName
  • 将长度为2的迭代器收集到HashMap中

    我能够有效地将我的输入解析为Iterator
  • 为什么这段 Python 代码执行了两次?

    我对 Python 非常陌生 并试图通过构建没有真正目的的非常愚蠢的程序来了解类 方法 范围等的工作原理 我下面写的代码假设只是定义一个类Functions这是使用实例化的x and a y值 然后可以执行各种简单的数学函数 例如加减法 乘
  • 在 Ruby 中生成唯一的排序分区

    我试图生成如下所示的一组序列 不按任何特定顺序 但这里显示为降序序列 请注意 每个序列也会下降 因为我对组合而不是排列感兴趣 我想将每个序列存储为一个数组 或者更佳地将序列集存储为数组的数组 但首先是第一件事 6 5 1 4 2 4 1 1
  • 在 PHP 应用程序中使用 C 进行计算:值得吗?

    我有一个PHP应用程序 有时需要进行大量计算 我搜索用户记录的操作并在很长一段时间内进行大量的经济分析 我想提高这些计算的速度 用C重写这些计算部分值得吗 在速度更快的语言中here http www unlimitednovelty co
  • 检查是否可以安全地关闭对话框

    在我的应用程序中 我在长时间运行的模态后台进程中显示一个对话框 当 android 从后台任务返回时 此对话框将被关闭 final ProgressDialog progressDialog ProgressDialog show acti
  • 如何使用 Java 使用 Selenium WebDriver 处理身份验证弹出窗口

    我正在尝试使用以下代码处理身份验证弹出窗口 FirefoxProfile profile new FirefoxProfile profile setPreference network http phishy userpass lengt
  • 使用 ConfigurationBuilder 设置基本路径

    我正在尝试为我正在构建的 NET Web 应用程序设置应用程序基本路径 我在配置生成器上不断收到错误 这是我得到的错误 DNX Version v4 5 1 error CS1061 ConfigurationBuilder does no
  • React:如何通过箭头键浏览列表

    我已经构建了一个简单的组件 其中包含单个文本输入 下面是一个列表 使用语义 ui 现在我想使用箭头键浏览列表 首先我必须选择第一个元素 但是如何访问特定的列表元素呢 其次 我将获取当前所选元素的信息并选择下一个元素 如何获取选择了哪个元素的
  • 如何将巨大的 TIFF 图像转换为 PNG/JPEG 而不会出现内存不足错误?

    我有一个 tiff 文件 18000 18000 尺寸和1 20 GB在尺寸方面 tiff 的 DPI 为 72 我想使用 400 DPI 将此 TIFF 转换为 PNG JPEG 我正在使用以下代码来做到这一点 public static
  • 在 C++ 中推导两个类的共享基数

    我几乎可以肯定 如果没有的话 我正在寻找的东西就无法完成反射 这还没有出现在语言中 但有时我会对 SO 中的特殊答案感到惊讶 所以让我们尝试一下 是否可以推导出具有公共共享基类的两种类型的 common base 因此以下内容是可能的 伪代
  • 当ajax调用被取消时,如何取消PHP进程?

    我目前正在开发一个拥有庞大数据库的 CRM 系统 如果用户想要搜索客户 可以使用ajax搜索 每当他在搜索字段中更改某些内容时 当呼叫处于待处理状态时 旧呼叫就会被取消 并且新呼叫将发送到服务器 我的问题是 服务器端的 php 进程继续运行
  • 如何使用 geom_errorbar 在堆积条形图中堆积误差条?

    我想使用 geom errorbar ggplot 将误差线堆叠在堆叠直方图中 在我的 ggplot 声明中 我尝试同时使用position stack and position identity 他们都没有工作 这是我的 ggplot 声
  • 为什么使用@JoinTable时@DiscriminatorColumn被忽略?

    假设我有以下表格 LAWSUIT ID TITLE PERSONS IN THE CASE
  • postMessage 在 IE11 上仍然损坏?

    当消息为 IE 11 时 window postMessage 似乎仍然被破坏 在窗口和子弹出窗口 选项卡之间使用 window open 当它从不同的域发送时 或在某些情况下相同的域 参见更新 16 01 IE 8 9 10 也存在类似问
  • Twitter Bootstrap 导航栏向右浮动将 div 移至新行

    您好 我正在尝试在导航栏右侧创建一个部分 我使用了 div 类 navbar right 它应该将 div 浮动到右侧 但我得到了一个新行 请参阅下面的代码并谢谢 div class navbar navbar default navbar
  • 从命令行创建 IPA 时,为什么我的构建阶段脚本不会被执行?

    问题 简短版本 为什么我的构建不会phase scripts从命令行创建 IPA 时执行 当我跑步时xcodebuild创建预定义的 IPA构建阶段脚本不会被执行 这是为什么 问题 冗长版本 我有一个工作区 其中有一个方案 我想从命令行创建
  • Linux页面缓存刷新顺序

    在我们将数据写入磁盘之前 有页面缓存 所以如果我有两次手术 write fileA write fileB 那么如果系统突然关机 我们不主动调用sync 调用 我想知道是否有可能我们写入文件的数据已经flush到磁盘了 而我们写入文件A的数
  • Pygame ValueError:无效的 rectstyle 对象

    我从下载了一个 pygame 示例here https github com eventia rabbitone称为rabbitone 并遵循相应的Youtube 视频 https youtu be TU4qDHBBHes 于是我研究了一下
  • openGL 光线拾取

    一般的光线拾取过程应如下 实验结果证明是正确的 将屏幕点变换为标准化设备空间方向向量 float x 2 0f mouse x width 1 0f float y 1 0f 2 0f mouse y height float z 1 0f