Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class

Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class:把交点几何、朝向和多对象最近命中统一成查询合同,并把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口,以公式、章专属交互和可重放故障证据独立重写。

学习目标

  • 能说明Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中的“把交点几何、朝向和多对象最近命中统一成查询合同,并把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口”,并指出公式中每个量的空间、单位或概率含义
  • 能比较正常基线与“不根据入射方向翻转法线,或遍历对象时没有收紧t上界;重构时改变像素坐标或初始化顺序,导致相同场景输出发生漂移”反例,定位front_face、单位法线、对象身份和最近命中距离、公开参数、initialize派生量、首末像素射线和重构前后PPM哈希中的首个差异
  • 能操作三个章专属实验,让法线、hit_record、hittable_list、camera class、initialize、render同时具备解释、视觉和练习证据
  • 能修改最小实现、固定输入重放,并判断“Surface Normals and Multiple Objects的输入、公式中间量、输出与恢复结果可用同一基线复算,且Moving Camera Code Into Its Own Class的输入、公式中间量、输出与恢复结果可用同一基线复算”是否重新成立

从一个会失败的图像实验开始

Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class要回答的不是“这个名词是什么”,而是:在固定输入下,如何验证“把交点几何、朝向和多对象最近命中统一成查询合同,并把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口”,并让一个反例可重复地推翻错误实现?先写下预期像素、几何或估计量,再运行基线;只要front_face、单位法线、对象身份和最近命中距离、公开参数、initialize派生量、首末像素射线和重构前后PPM哈希无法指出差异来自哪一步,图像看起来正确也不能通过。

本页的不变量是:Surface Normals and Multiple Objects的输入、公式中间量、输出与恢复结果可用同一基线复算,且Moving Camera Code Into Its Own Class的输入、公式中间量、输出与恢复结果可用同一基线复算。反例“不根据入射方向翻转法线,或遍历对象时没有收紧t上界;重构时改变像素坐标或初始化顺序,导致相同场景输出发生漂移”只改变一个条件,因而正常、故障与恢复三次运行应能用同一输入直接比较。

原版、版次与事实来源

Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class以官方4.0.2全文核对实现顺序、公式与调试边界,并以官方源码仓库交叉检查可编译接口。课程示例为独立教学重写;固定版本后不把Vulkan、GPU管线或其他书的模板倒灌进这个纯C++路径追踪器。

六个检查词

。这些词共同约束把交点几何、朝向和多对象最近命中统一成查询合同,并把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口,每个词都必须落到公式、交互状态或可重放输出,不能只出现在术语表。

原书单元与独立机制解释

Surface Normals and Multiple Objects

法线从球心指向交点,hit_record 保存t、位置、法线与正反面,hittable_list 逐对象缩短允许上界以保留最近命中。这样材质只消费稳定的命中记录,不再重复求交细节。

本单元的正式坐标是法线、hit_record、hittable_list。验证Surface Normals and Multiple Objects时,先制造“不根据入射方向翻转法线,或遍历对象时没有收紧t上界”,再检查front_face、单位法线、对象身份和最近命中距离能否把错误定位到把交点几何、朝向和多对象最近命中统一成查询合同的首个分叉。

n=PCr,tmaxtclosestn=\frac{P-C}{r},\qquad t_{\max}\leftarrow t_{\mathrm{closest}}

Moving Camera Code Into Its Own Class

Moving Camera Code Into Its Own Class把分散在main中的视口计算、get_ray、ray_color与render循环迁入camera类。重构前后图像必须一致;initialize集中派生参数,render只负责按像素调度并写出结果。

本单元的正式坐标是camera class、initialize、render。验证Moving Camera Code Into Its Own Class时,先制造“重构时改变像素坐标或初始化顺序,导致相同场景输出发生漂移”,再检查公开参数、initialize派生量、首末像素射线和重构前后PPM哈希能否把错误定位到把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口的首个分叉。

R=write(color(get_ray(pixel)))R=write(color(get\_ray(pixel)))

先预测,再操作三个章专属实验

分步1 / 3

1. 概念与因果路径

在Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中选择任一正式坐标,沿机制链查看它的输入、状态变化和可推翻探针。

射线、交点与章节机制

Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class

沿一条可见射线检查把交点几何、朝向和多对象最近命中统一成查询合同,并把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口,改变t时只移动采样点,不偷偷改变原点或方向。

正式概念坐标

射线参数 t
Q 原点P(1)P(t)=Q+td

Surface Normals and Multiple Objects / 法线

法线从球心指向交点,hit_record 保存t、位置、法线与正反面,hittable_list 逐对象缩短允许上界以保留最近命中。这样材质只消费稳定的命中记录,不再重复求交细节。

可推翻探针:front_face、单位法线、对象身份和最近命中距离

版本坐标:Peter Shirley、Trevor David Black、Steve Hollasch《Ray Tracing in One Weekend》4.0.2。实验状态只解释本章因果合同,不替代官方C++源码。

最小可重现实验

if (object.hit(r, interval(t_min, closest), rec)) {
  closest = rec.t;
  rec.set_face_normal(r, outward_normal);
  nearest = rec;
}

运行Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class时固定随机种子、输入几何、坐标约定和数值精度;记录编译命令或算法版本、输出摘要与失败条件。实验输出若依赖隐藏全局状态,必须先消除该依赖再比较。

练习与答案

练习

问题 1:公式与边界。 怎样用一个数值样本证明 n=PCr,tmaxtclosestn=\frac{P-C}{r},\qquad t_{\max}\leftarrow t_{\mathrm{closest}} 中的量没有混用空间、单位或概率密度?

问题 2:正式坐标。 法线、hit_record、hittable_list、camera class、initialize、render如何进入可操作验证?

问题 3:故障恢复。 如何证明“不根据入射方向翻转法线,或遍历对象时没有收紧t上界;重构时改变像素坐标或初始化顺序,导致相同场景输出发生漂移”已经真正修复?

本章回顾

掌握Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class意味着能将“把交点几何、朝向和多对象最近命中统一成查询合同,并把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口”写成明确公式或算法,能操作正式坐标,能制造“不根据入射方向翻转法线,或遍历对象时没有收紧t上界;重构时改变像素坐标或初始化顺序,导致相同场景输出发生漂移”,还能凭front_face、单位法线、对象身份和最近命中距离、公开参数、initialize派生量、首末像素射线和重构前后PPM哈希恢复同输入结果,而不是把一段Vulkan生命周期模板换上本章标题。

名词解释

本章出现的专业名词,用大白话再讲一遍。

法线

法线在Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中用于把交点几何、朝向和多对象最近命中统一成查询合同;应由front_face、单位法线、对象身份和最近命中距离确认,而不是只凭术语出现。

hit_record

hit_record在Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中用于把交点几何、朝向和多对象最近命中统一成查询合同;应由front_face、单位法线、对象身份和最近命中距离确认,而不是只凭术语出现。

hittable_list

hittable_list在Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中用于把交点几何、朝向和多对象最近命中统一成查询合同;应由front_face、单位法线、对象身份和最近命中距离确认,而不是只凭术语出现。

camera class

camera class在Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中用于把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口;应由公开参数、initialize派生量、首末像素射线和重构前后PPM哈希确认,而不是只凭术语出现。

initialize

initialize在Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中用于把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口;应由公开参数、initialize派生量、首末像素射线和重构前后PPM哈希确认,而不是只凭术语出现。

render

render在Surface Normals and Multiple Objects × Moving Camera Code Into Its Own Class中用于把相机初始化、射线生成、颜色求值与图像写出收拢为稳定接口;应由公开参数、initialize派生量、首末像素射线和重构前后PPM哈希确认,而不是只凭术语出现。

阅读导航

← Adding a Sphere · Antialiasing →

讨论

评论区加载中…