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

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

相关文章

【因果推断python】51_去偏/正交机器学习3

目录 What is Non-Parametric About? What is Non-Parametric About? 在我们继续之前,我只想强调一个常见的误解。当我们考虑使用非参数 Double-ML 模型来估计 CATE 时,我们似乎会得到一个非线性治疗效果。例如,让我们假设一个非常简单的数据生成过程(DGP),其中 discont 对销售额的影响是非线性的,但却是通过

springCloudAlibaba之链路追踪组件---skywalking

skywalking skywalking skywalking 介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统,通常会遇到下面一些问题,比如:如何串联整个调用链路、快速定位问题?如何明确各个微服务之间的依赖关系?如何进行各个微服务接口的性能分析?如何跟踪整个业务流程的通用处理程序?

番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算

前言:Hello大家好,我是小哥谈。YOLOv8是ultralytics公司在2023年1月10号开源的,是YOLOv5的下一个重大更新版本,目前支持图像分类、物体检测和实例分割任务,在还没有开源时就收到了用户的广泛关注。它是一个SOTA模型,建立在以前YOLO版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。本文就对YOLOv8算法进行解析并以车辆检测及速度计算为案例进行

SkyWalking 全链路追踪工具-使用入门

文章目录 前言SkyWalking简介架构入门使用1、下载2、配置探针3、配置参数到需要监控的应用4、配置skyWalking5、启动skyWalking6、查看服务7、sw-web界面不显示数据 探针技术1、javaAgent介绍2、javaAgent使用 前言 随着业务越来越复杂,企业应用也进入了分布式服务的阶段,传统的日志监控等方式无法很好达到跟踪调用,排查问题等需求。

测试基础14:测试用例设计方法-正交实验法

课程大纲 1、定义         正交表是一种在数学和统计学中使用的特殊表格,用于设计实验,以在有限的测试次数下获得最大的测试覆盖率。         它通过均衡搭配的特性,从全面试验中挑选出有代表性的点进行测试。 2、应用场景         适用于配置类软件中组合比较多的情况。与判定表对比,输出结果不复杂,不会因组合不同有非常大差异。(如:多个单选下拉框、选项多的单选框组合

【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上

【JAVA】SpringBoot + skywalking 将接口的入参、出参、异常等信息上报到skywalking 链路追踪服务器上 1.下载SkyWalking APM https://skywalking.apache.org/downloads/ jdk8 不支持 SkyWalking APM 9.3.0以上版本,所以这里我们下载 9.3.0版本 2.下载 Java

分析线程池的构造过程,追踪核心成员变量

分析线程池的构造过程,追踪核心成员变量 1、背景2、核心参数3、这样设计的好处 1、背景 上图是对线程池原理的一个详细的表达,它体现了线程池的几个核心概念,具体是哪些概念呢,让我们一起来探索。 2、核心参数 首先通过对Executors创建线程池的方法签名的分析,我们会发现那几种创建线程池的方法,其实都是对ThreadPoolExecutor类的进行包装,提供定制化的能力

实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识

在 Stable Diffusion 中控制光线的三种方式

光线在摄影中扮演着至关重要的角色,并对图像的整体质量和意境产生重要影响。你可以利用光线来增强主题,创造深度和立体感,传达情感,并突出重要细节。 在本文中,你将了解通过以下方法来控制光线: 光线提示词区域光线控制ControlNet img2img 软件 我们将使用 AUTOMATIC1111 的 Stable Diffusion GUI 来进行图片生成。你可以在 Google Colab、

重庆思庄技术分享——启动Oracle下最小追踪日志

启动Oracle下最小追踪日志 11g默认是关闭的: SQL> select supplemental_log_data_min from v$database; SUPPLEME -------- NO 打开方式: SQL> alter database add supplemental log data; Database altered. SQL>  select supplemental