太极图形课——渲染——光线追踪实战第一部分呢

2024-06-05 01:12

本文主要是介绍太极图形课——渲染——光线追踪实战第一部分呢,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

根据概念部分我们逐步通过太极实现光线追踪

总共可以分为5步

第一步:如何发射出一道光?

首先明确何为一道光,光从我们眼睛(摄像机)射出,那么在三维虚拟世界里,我们可以认为这道光就是一条射线,在三维世界里,一条射线可以由一个点和一个向量定义

任何在这条射线上的点,我们都可以用一个标量t来表示,这个标量的值代表了这个点到射出去的原点的距离

那么我们如何把这样一条射线放进我们所定义的虚拟世界中呢,首先需要设定的就是在这个虚拟世界中我们眼睛(摄像机)的位置,这个位置通过三维世界的坐标一个三维的数组就可以表达了,第二就是定义我们看的方向,也就是方向向量,也通过一个三维的数组表达

在概念中说,最后我们要将三维的物体投影在眼前的屏幕上就可以了,那么我们就需要放置屏幕,我们所看的方向穿过这个屏幕的中心,这个屏幕垂直于我们的视线

现在屏幕的位置还没有确定,首先我们需要确定屏幕和我们眼睛的距离,再确定屏幕屏幕的方向,我们设定一个三维向量来确定,最后就是屏幕的大小,这个我们通过设定一个fov来表示

通过fov可以求出屏幕的半宽和半长,宽由长决定,取决于你需要几比几的屏幕,例如16:9,有了这些我们设定一个以屏幕中心为原点的坐标系uvw,最后可以确定眼睛或者说摄像机左下角出发的点,并确定其水平和垂直的向量

此时我们就已经准备好发射射线

#首先定义一个世界坐标系,其中有眼睛或者说摄像机的位置
lookfrom[None] = [x,y,z]
#定义朝向
lookat[None] = [x,y,z]
#定义屏幕和其中心点
theta = 1.0/3.0 *pi #fov设置
half_height = ti.tan(theta/2.0) *distance
half_width = aspect_ratio * half_height * distance
w = (lookfrom[None] - lookat[None]).normalized()
u = (upp[None].cross(w)).normalized()
v = w.cross(u)
#可以得到屏幕的视点位置
cam_lower_left_corner[None] = (lookfrom[None] - half_width*u - half_height *v - w)*distance 
cam_horizational[None] = 2* half_width * u * distance 
cam_vertical[None] = 2 * half_height * v *distance
#发射光线
u = float(j)/res_x
v = float(i)/res_Y
ray.direction = cam_lower_left_corner[None] + u * cam_horizational[None] + v * cam_vertical[None] - lookfrom[None]
#pixel块是一个像素点方块,我们可以将其放在正中间
u = float(i + 0.5)/res_x
v = float(j + 0.5)/res_y

由于像素是一个方块,我们还可以把这个射线正好移动到点的中心

第二步: 如何将光和物体求交

之前已经了解到一个视线由一个射线表示,射线上的每一个点可以通过一个标量t来表示,那么怎么实现物体和实现的求交呢,对于一个圆来说。我们可以将圆用一个参数方程来表示,然后将点用t来代替我们就可以得到下列的方程

将方程简化就可以获得一个一元二次方程

通过求根公式韦达定理,可以判断是否有相交,相交的点是哪一个,我们需要去第一个正根,在计算机中由于有时候会出现0.0001这种明显是物体没有相交而是反射的正根,因此需要添加一个门槛,例如正根至少要大于0.001

目前教程所给代码中仅仅只实现了与圆的相交,实际上还可以实现和平面,三角形实现相交,例如对于一个平面来说,我们

的参数方程可以定义为平面上任意两个点所构成的向量和平面的法向量垂直,也就是点乘为0,将任意一点用视线的点代替

可以获得的根的方程为向量d和法向量点乘不为0,也就是这两个方向不垂直的时候,一定有一个点

如果为点乘为0,也分为从平面出发导致与平面重合以及不从平面出发,永远没有交点

进一步如何判断有点的话是否该点在三角形内

此时需要引入的概念是重心的概念,具体概念如下图,三个三角形的面积相加等于整个三角形说明这个点在三角形内

这个重心的概念可以推广到四面体上

此时就可以判断三角形网格的相交了

最后可以得到两种方法,一种是隐式积分,找到面的定义,将点的定义代入其中,最后得到一个高纬的方程,简化后都是一个一元二次方程,第二种方法遍历全部的三角形面片,找到点在哪个三角形里面

这篇关于太极图形课——渲染——光线追踪实战第一部分呢的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

Android SurfaceFlinger——图形内存分配器(十一)

前面的文章中的图层合成器(HWC),这里我们接着看一下 SurfaceFlinger 中的另一个重要服务——图形内存分配器。 一、简介         android.hardware.graphics.allocator@2.0 是 Android 系统中硬件抽象层(HAL)的一个组件,专门用于图形内存的分配和管理。它是 SurfaceFlinger 在处理图形数据时所依赖的

PyTorch模型_trace实战:深入理解与应用

pytorch使用trace模型 1、使用trace生成torchscript模型2、使用trace的模型预测 1、使用trace生成torchscript模型 def save_trace(model, input, save_path):traced_script_model = torch.jit.trace(model, input)<

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象,小弟有哪些,有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些: 基类: ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradientGradientStopEvent 二级或三级类 继承Ite

【计算机组成原理】部分题目汇总

计算机组成原理 部分题目汇总 一. 简答题 RISC和CICS 简要说明,比较异同 RISC(精简指令集)注重简单快速的指令执行,使用少量通用寄存器,固定长度指令,优化硬件性能,依赖软件(如编译器)来提升效率。 CISC(复杂指令集)包含多样复杂的指令,能一条指令完成多步操作,采用变长指令,减少指令数但可能增加执行时间,倾向于硬件直接支持复杂功能减轻软件负担。 两者均追求高性能,但RISC

MyBatis-Plus常用注解详解与实战应用

MyBatis-Plus 是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了大量的常用注解,使得开发者能够更方便地进行数据库操作。 MyBatis-Plus 提供的注解可以帮我们解决一些数据库与实体之间相互映射的问题。 @TableName @TableName 用来指定表名 在使用 MyBatis-Plus 实现基本的 C

[大师C语言(第三十六篇)]C语言信号处理:深入解析与实战

引言 在计算机科学中,信号是一种软件中断,它允许进程之间或进程与内核之间进行通信。信号处理是操作系统中的一个重要概念,它允许程序对各种事件做出响应,例如用户中断、硬件异常和系统调用。C语言作为一门接近硬件的编程语言,提供了强大的信号处理能力。本文将深入探讨C语言信号处理的技术和方法,帮助读者掌握C语言处理信号的高级技巧。 第一部分:C语言信号处理基础 1.1 信号的概念 在Unix-lik

MATLAB算法实战应用案例精讲-【数模应用】三因素方差

目录 算法原理 SPSSAU 三因素方差案例 1、背景 2、理论 3、操作 4、SPSSAU输出结果 5、文字分析 6、剖析 疑难解惑 均方平方和类型? 事后多重比较的类型选择说明? 事后多重比较与‘单独进行事后多重比较’结果不一致? 简单效应是指什么? 边际估计均值EMMEANS是什么? 简单简单效应? 关于方差分析时的效应量? SPSSAU-案例 一、案例

[最全]设计模式实战(一)UML六大原则

UML类图 UML类图是学习设计模式的基础,学习设计模式,主要关注六种关系。即:继承、实现、组合、聚合、依赖和关联。 UML类图基本用法 继承关系用空心三角形+实线来表示。实现接口用空心三角形+虚线来表示。eg:大雁是最能飞的,它实现了飞翔接口。 关联关系用实线箭头来表示。当一个类"知道"另一个类时,可以用关联。eg:企鹅需要"知道"气候的变化,需要"了解"气候规律。 聚合关