《学一辈子光线追踪》 六 正交基

2024-04-07 20:38
文章标签 一辈子 追踪 光线 正交

本文主要是介绍《学一辈子光线追踪》 六 正交基,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术

在最后一章中,我们开发了生成与日晷相对的随机方向的方法。我们要做的是基于任意曲面的法向量。正交正规基(ONB)是三个相互正交的单位向量的集合。笛卡尔xyz轴就是这样的一个ONB,我有时忘记了它必须坐在某个真实的地方,有真实的方向,才能在真实世界中有意义,而在虚拟世界中有一些虚拟的地方和方向。图片是相机和场景相对位置/方向的结果,只要相机和场景在同一坐标系中描述,一切都是可以的。

假设我们有一个原点o和笛卡尔单位向量x/y/z。当我们说一个位置是(3,-2,7)时,我们实际上是说:

位置为 o + 3*x - 2*y + 7*z

如果我们想测量另一个坐标系中原点为o'且基向量为u/v/w的坐标,我们只需找到数字(u,v,w)即可:

位置是o'+uu+vv+w。

如果你学习图形入门课程,你会花很多时间在坐标系和4x4坐标变换矩阵上。注意,这在图形中是很重要的!但我们不需要它。我们需要的是用相对于n的集合分布生成随机方向。我们不需要原点,因为方向与原点无关。我们需要两个相互垂直于n的余切向量。

有些模型至少会有一个余切向量。制作ONB的最困难的情况是我们只有一个向量。假设我们有任何不为零长或不平行于n的向量a,我们可以利用 cross(c,d) 同时垂直于c和d的叉积的性质得到垂直于n的向量s和t:

t = unit_vector( cross(a, n) )
s = cross(t,n)

关键是,我们没有a,如果我们在某个点上选择一个特定的a,我们将得到一个与a平行的n。一个常见的方法是使用if语句来确定n是否是一个特定的轴,如果不是,则使用该轴。

If (fabs(n.x()) > 0.9)a = (0,1,0)
elses = (1,0,0)

一旦我们有一个ONB,并且我们有一个相对于z轴的随机向量 (x,y,z) ,(该项量在原始坐标系中的值是(x,y,z))我们就可以得到相对于n的向量:

Random vector = x*s + y*t + z*n

你可能会注意到我们用了类似的数学方法从相机获取光线。这可以看作是对相机自然坐标系的改变。我们应该为ONB创建一个类还是实用函数足够了?我不确定,但让我们创建一个类,因为它不会比实用函数更复杂:

#ifndef __ONB_H__
#define __ONB_H__
#include "vec3.h"
class onb {
public:onb(){}inline vec3 operator[](int i)const { return axis[i]; }vec3 u()const { return axis[0]; }vec3 v()const { return axis[1]; }vec3 w()const { return axis[2]; }vec3 local(float a, float b, float c)const { return a*u() + b*v() + c*w(); }vec3 local(const vec3&a)const { return a.x()*u() + a.y()*v() + a.z()*w(); }void build_from_w(const vec3&);vec3 axis[3];
};
void onb::build_from_w(const vec3&n) {axis[2] = unitVector(n);vec3 a;if (fabs(w().x()) > 0.9)a = vec3(0, 1, 0);elsea = vec3(1, 0, 0);axis[1] = unitVector(cross(w(),a));axis[0] = cross(w(), v());
}
#endif

我们可以用这个重写Lambertian材料,得到:

inline vec3 random_cosine_direction() {float r1 = myRandom();float r2 = myRandom();float z = sqrt(1 - r2);float phi = 2 * M_PI*r1;float x = cos(phi) * 2 * sqrt(r2);float y = sin(phi) * 2 * sqrt(r2);return vec3(x, y, z);
}
virtual bool scatter(const ray& r_in, const hit_record& rec, vec3& alb, ray& scattered, float &pdf)const {onb uvw;uvw.build_from_w(rec.normal);vec3 direction = uvw.local(random_cosine_direction());scattered = ray(rec.p, unitVector(direction), r_in.time());alb = albedo->value(rec.u, rec.v, rec.p);pdf = dot(uvw.w(), unitVector(scattered.direction())) / M_PI;//return true;
}

得到结果:

这个结果对吗?我们还不能确定。在缺乏可靠的参考解决方案的情况下,追踪错误是很困难的。让我们暂时把它搁置一下,然后继续消除一些噪音。

这篇关于《学一辈子光线追踪》 六 正交基的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883619

相关文章

SpringCloud之Sleuth(Micrometer)+ZipKin分布式链路追踪

(学习笔记) 1、分布式链路追踪概述 问题:在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。 在分布式与微服务场景下,我们需要解决如下问题:   在大规模分布式与微服务集群下,如何实时观测系统的整体调用链路情况。

钓鱼邮件真相追踪:XDR见招拆招!

钓鱼陷阱,财富“蒸发” 如果一家规模5000人、业务遍布全球的企业之中有一位员工不小心点进了一个钓鱼邮件,会发生什么……?终端失陷?数据泄露?失去客户信任? 最让人破碎的当然是……核心资产泄露,钱没了!! 人有失手,"鱼"有逃命 某大型零售企业财务部门小张收到一封看似来自公司财务部的邮件,由于内容与其实际工作情况相符,小张打开了邮件中的附件,并点击了附件里的下载链接

用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化

概述 WWDC 24 一声炮响为我们送来 Swift 6.0 的同时,也颇为“低调”的推出了 SwiftData 2.0。在新版本的 SwiftData 中,苹果为其新增了多个激动人心的新特性,其中就包括历史记录追踪(History Trace)。 不过,历史记录追踪目前看起来似乎有些“白璧微瑕”,略微让人有些不爽。在这里就让我们看看如何利用 Swift 结构化并发中的异步序列(Asy

是噱头还是低成本新宠?加州大学用视觉追踪实现跨平台的机器手全掌控?

导读: 在当今科技飞速发展的时代,机器人的应用越来越广泛。从工业生产到医疗保健,从物流运输到家庭服务,机器人正在逐渐改变我们的生活方式。而机器人的有效操作和控制,离不开高效的遥操作系统。今天,我们要介绍的是UC San Diego 的新研究,一种创新的跨平台视觉外骨骼系统ACE。©️【深蓝AI】编译 1. ACE系统的背景与概述 近年来,机器人研究者们通常利用真实世界的机器人数据,来训练

GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

任务         1.实现单帧降噪         2.实现多帧投影         3.实现多帧累积         Bonus:使用À-Trous Wavelet 加速单帧降噪 实现         单帧降噪         这里实现比较简单,直接根据给出的联合双边滤波核的公式就能实现          Buffer2D<Float3> Denoiser::Fil

追踪uboot下tftp命令的代码执行过程-Nagul

一、网卡驱动的添加  网络在uboot中的启动是在uboot的第二阶段启动代码中 /lib_arm/board.c [cpp]  view plain copy void start_armboot (void){}   里面有网络初始化函数 [cpp]  view plain copy eth_initialize(gd->bd)

SpringBoot链路追踪②:如何集成?

首先下载Zipkin的jar包:Central Repository: io/zipkin/zipkin-server (maven.org) 根据自己的项目版本。我的版本分别是: <spring-boot.version>2.7.18</spring-boot.version> <spring-cloud.version>2021.0.8</spring-cloud.version> 选

分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用

目录 一、什么是链路追踪? 二、核心思想Dapper (一)Dapper链路追踪基本概念概要 (二)Trace、Span、Annotations Trace Span Annotation 案例说明 (三)带内数据与带外数据 带外数据 带内数据 数据的传递与集中 (四)采样 采样的目的 采样率的调整 采样机制的实现 (五)存储 为什么选择 BigTable 存

windows平台调用函数堆栈的追踪方法

转自:http://blog.csdn.net/lanuage/article/details/52203447 在windows平台,有一个简单的方法来追踪调用函数的堆栈,就是利用函数CaptureStackBackTrace,但是这个函数不能得到具体调用函数的名称,只能得到地址,当然我们可以通过反汇编的方式通过地址得到函数的名称,以及具体调用的反汇编代码,但是对于有的时候我们需要直接得

旅行追踪和行程规划工具AdventureLog

什么是 AdventureLog ? AdventureLog 是一种记录您的旅行并与世界分享的简单方法。您可以在日志中添加照片、笔记等。跟踪您访问过的国家、探索去过的地区和地方。您还可以查看您的旅行统计数据和里程碑。AdventureLog 旨在成为您终极的旅行伴侣,帮助您记录您的冒险经历并轻松规划新的冒险经历。 主要功能: 使用姓名、日期、地点、描述和评级等字段记录过去的冒险经