如何在光线追踪器中移动相机?

2024-02-26

我目前正在研究光线追踪技术,我认为我已经做得相当不错了;但是,我还没有讨论过相机。

到目前为止,我使用平面片段作为视图平面,它位于(-width/2, height/2, 200) and (width/2, -height/2, 200)[200只是z的固定数字,可以改变]。

除此之外,我主要使用相机e(0, 0, 1000),我使用透视投影。

I send rays from point e to pixels, and print it to image's corresponding pixel after calculating the pixel color.enter image description here

这是我创建的图像。希望您可以通过查看图像来猜测眼睛和视平面的位置。

我的问题从这里开始。是时候移动我的相机了,但我不知道如何将 2D 视图平面坐标映射到规范坐标。有一个变换矩阵吗?

我认为该方法需要知道视图平面上像素的 3D 坐标。我不确定这是正确的使用方法。所以你有什么建议?


有多种方法可以做到这一点。这就是我所做的:

  1. 选择一个点来表示相机位置(camera_position).
  2. 选择一个指示相机观察方向的矢量(camera_direction)。 (如果您知道相机正在观察的点,您可以通过减去来计算该方向向量camera_position从那时起。)您可能想要标准化(camera_direction),在这种情况下它也是图像平面的法线向量。
  3. 选择另一个从相机的角度(大约)“向上”的归一化向量(camera_up).
  4. camera_right = Cross(camera_direction, camera_up)
  5. camera_up = Cross(camera_right, camera_direction)(这可以纠正“向上”选择中的任何错误。)

可视化图像平面的“中心”camera_position + camera_direction。向上和向右矢量位于图像平面内。

您可以选择图像平面的矩形部分来对应您的屏幕。该矩形部分的宽度或高度与camera_direction的长度之比决定了视野。要放大,您可以增加camera_direction或减少宽度和高度。执行相反的操作即可缩小。

所以给定一个像素位置(i, j),你想要(x, y, z)图像平面上的该像素。从中你可以减去camera_position得到射线向量(然后需要对其进行归一化)。

Ray ComputeCameraRay(int i, int j) {
  const float width = 512.0;  // pixels across
  const float height = 512.0;  // pixels high
  double normalized_i = (i / width) - 0.5;
  double normalized_j = (j / height) - 0.5;
  Vector3 image_point = normalized_i * camera_right +
                        normalized_j * camera_up +
                        camera_position + camera_direction;
  Vector3 ray_direction = image_point - camera_position;
  return Ray(camera_position, ray_direction);
}

这只是为了说明,因此并未进行优化。

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

如何在光线追踪器中移动相机? 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • JSON-lib 转义/保留字符串

    我正在使用 Java 的 JSON lib 库http json lib sourceforge net http json lib sourceforge net 我只想添加看起来像 JSON 的简单字符串 但我不希望库自动找出它可能是
  • 使用“全选”时排除禁用的复选框

    我在表中有带有标签的复选框 我在表 全选 之外添加了一个复选框 ID 为 chkbox 现在下面的代码工作正常 这是 选择和取消选择表中的所有复选框 现在有一些页面由于业务逻辑而禁用了一些复选框 我希望这些复选框不应该受到影响
  • Java 创建一个新文件,或者覆盖现有文件

    我想要实现的是创建一个文件 无论该文件是否存在 我尝试使用File createNewFile 但这只会创建该文件 如果该文件尚不存在 我应该使用File delete 进而File createNewFile 或者有更清晰的方法吗 Fil
  • 如何让工具提示在 IE 中显示时间更长

    我得到以下内容 span title 在 Firefox 中 工具提示会一直停留在那里 直到鼠标移动 但在 IS 中 它只停留大约 5 秒 然后消失 有没有办法让它持续更久 没有内置的浏览器工具提示 不 有大量类似工具提示的 UI 组件使用
  • 关于jsp源代码

    我开发了一个非常大的 Web 应用程序 如果我需要在 JSP 页面中进行任何更改 则需要花费太多时间来查找 JSP 页面 链接 操作等 那么 是否有任何工具或技术可以让我直接获取该特定 JSP 页面的代码 我认为 查看来源 是不同的 它只显
  • Hibernate:无法反序列化 - 无效的流标头

    关于如何解决此错误有什么想法吗 我将 Spring JPA 与 Hibernate 一起使用 下面是必要的详细信息 实体类别1 Entity Table name ways TypeDef name hstore typeClass Hst
  • 如何在 Android 的 TabLayout 中使选项卡标题向左对齐

    我似乎无法在 TabLayout 内将选项卡标题向左对齐 目前 标题居中 这是什么I want https i stack imgur com Vy6FP jpg实现 这就是I have https i stack imgur com FY
  • 从 c# 中的 app.config 获取 ConnectionString [重复]

    这个问题在这里已经有答案了 我已经在 app config 文件中定义了我的连接字符串
  • WPF 以编程方式实例化用户控件以将其呈现为 PNG

    我想在 DLL 中以编程方式实例化用户控件 然后将其保存为 PNG 文件 这对于PngBitmapEncoder和RenderTargetBitmap来说一般是没有问题的 这是我的问题 如何实例化该控件 简单地使用 new operator
  • Pandas 将零替换为最接近的平均非零值

    我有一个数据框 df pd DataFrame A 0 0 15 0 0 12 0 0 0 5 我想用最接近的非零值替换 0 值 比如第一个值是0 那么我发现最接近的非零值是15 所以我把它替换为15 那么数据就变成了 15 0 15 0
  • 即使存在未设置为 true,Rails 验证也需要数字

    我正在尝试保存一条没有设置字段的记录 该记录在模型中具有验证数值 即使验证中不需要存在 它仍然会抛出该字段不是数字的错误 验证 validates network id numericality gt true 保存模型的代码 networ
  • 在实现 ArrayAccess 和 Iterator 的对象上使用 foreach

    有没有办法迭代实现 ArrayAccess 和 Iterator 接口的对象的键 数组访问很有魅力 但我不能在那些对象上使用 foreach 这对我有很大帮助 是否可以 到目前为止我有这样的代码
  • 如何使用 xdist 和 django_coverage_plugin 并行 pytest 运行覆盖率报告

    使用以下设置 计算出的覆盖率小于使用没有并行化的单线程的覆盖率 Coverage 仅在项目根目录中创建 1 个覆盖文件 我预计这就是问题所在 我无法确定我做错了什么 报告的覆盖范围比我简单地运行要少coverage m pytest 在单线
  • 如何使用 Gmail API 访问我拥有的 Gmail 帐户?

    我想将节点脚本作为 cronjob 运行 它使用 Gmail 的 API 来轮询我拥有的 Gmail 帐户 我正在关注这些快速入门说明 https developers google com gmail api quickstart nod
  • JTabbedPane:选项卡左侧的图标

    你好 我正在使用 nimbus 外观和感觉 并有一个带有图标和文本的选项卡窗格 现在图标出现在文本的右侧 而我想将其放在左侧 我还想在图标和文本之间添加一些间距 thanks tab组件需要自己设置 它控制选项卡标题的呈现方式 Create
  • 如何以编程方式录制IOS屏幕

    有没有办法以编程方式录制 IOS 屏幕 意味着您正在执行的任何活动 例如单击按钮 滚动表格视图 即使正在播放的视频会与其他活动一起再次捕获 尝试过这些 https www raywenderlich com 30200 avfoundati
  • 保存时检测更改 Laravel 4:Eloquent

    我正在使用 Laravel 4 框架 我正在尝试找出一种方法来显示通知 具体取决于是否save 成功与否 这是我到目前为止所拥有的 if user gt save Session flash success woohoo success e
  • 将一系列父子关系转化为层次树?

    我有一堆名称 父名称对 我想将它们变成尽可能少的层次树结构 例如 这些可能是配对 Child Parent H G F G G D E D A E B C C E D NULL 需要将其转换为层次树 D E A B C G F H 我想要的
  • 防止后退按钮关闭我的应用程序

    我在应用程序的活动中使用以下代码来防止它关闭我的应用程序 Prevent app from being killed on back Override public boolean onKeyDown int keyCode KeyEven
  • 如何在光线追踪器中移动相机?

    我目前正在研究光线追踪技术 我认为我已经做得相当不错了 但是 我还没有讨论过相机 到目前为止 我使用平面片段作为视图平面 它位于 width 2 height 2 200 and width 2 height 2 200 200只是z的固定