计算机图形学第九天

阴影原理的粗略讲解

在这里插入图片描述

分三步操作:
1.先把光源当作摄像机 从光源往场景看 记录不同的位置的深度a(也就是绿色点的位置)
2.再从实际的摄像机往场景看 记录不同位置点重新投影回光源(也就是相对于光源)的深度b(也就是黑色的点)
3.最后把这两个值做对比 就会发现蓝色线条那几个点a=b 而红线那个点 a!=b 所以红线的那个黑点是在阴影中

在这里插入图片描述
右边就是从光源中看向场景的样子
左边是实际上我们记录的数据(也就是这些相应的深度值)

软硬阴影

x
上面的图就是硬阴影 下面的图就是软阴影 而完全在物体影子中的就是硬阴影 比如Umbra中的 而部分在影子中的就是硬阴影 就是penumbra中的
软硬阴影的产生主要在于光源在实际生活中是有一个体积的 并不是像冯光照那样是一个点

光线追踪

在这里插入图片描述
摄像机的位置投射出一根光线和场景中的物体相交 当光线和场景物体相交时 将相交点和光源连线 如果连线没有被阻挡则光源可见 则计算并返回该像素的值

Recursive(Whitted-Style)Ray Tracing

在这里插入图片描述
上面的空白球可以实现反射和折射的效果 所以当从摄像机处发射的光线接触到该物体时 一部分发生了折射(占一部分权值)一部分发生了反射(占一部分权值)最终 primary ray碰到的物体和secordary rays碰到的物体的像素颜色都会按相应的权值相加起来 返回到image plane上从而实现该物体的反射和折射 下面这张图就是左边 的球是折射的结果 右边的物体时反射的结果
在这里插入图片描述

实现光线追踪

物体隐式表示时的追踪

这时物体一般是以数学公式表示的 所以我们只需要判断光线的表达式是否与物体的表达式相交就行了

任何一条光线都可以被描述为:

r(t) = o + td 0 <= t < 无限大
光线函数 = 起始位置 + t时间 * 光线的方向

一个球的描述:

p时球上任意一个点 c是球心的位置 r是半径
(p-c)2- r2 = 0

光线和球发生交点

让o+td代替p 意思就是经过一个t时间光线会经过球 和球发生交点
((o+td) - c)2 - r2 = 0

交点求解

将这个式子整成:
at2 + bt + c = 0
a = d * d
b = 2(o - c) * d
c = (o - c) * (o - c) - r * r
最终就用那个什么一元二次方程的求和公式就行了
t = ((-b) (± )(b2 - 4ac)(1/2) ) / 2a

物体现式表示时的追踪

此时物体一般是以已知点的三角形形式表达的 所以我们要判断的是光线的表达式是否通过三角形 那我们就需要判断分两步判断:
1.光线是否通过三角形所在的面
2.如果通过了这个面 通过的这个点是否在三角形内部

三角形所在的面如何表示

我们一般可以通过一个面的法向量和该面上的任意一点表示一个面
n为法向量 p^为平面上的一个点
所以我们可以表示三角形所在面为:
(p - p^) * n = 0

判断相交

一样的 把光线表达式代入平面表达式:
(o + td - p^) * n = 0
t = ((p^ - o) * n) / (d * n)
这样就先求得了是否在平面内 然后再判断这个点是否在三角形内就行了

另一种更简单的(光线和三角形求交)方法

在这里插入图片描述
可以看到式子左边是光线的表达式 式子右边是三角形的重心坐标(重心坐标可以表示三角形内任意一个点)
解出答案后要判断几个点
1.解出的t是否在光线方向
2.(1-b1-b2),b1,b2是否是大于零的(判断这个点是否在三角形内)
然后通过图中的解法就能解出这个点

如何加速

前面我们所知道的光线追踪求交都是和每一个三角形或者数学式子求交
但是如果三角形的数量足够多的时候明显不适合每个三角形都求交 这个时候我们就为每一个模型创建一个包围盒(Axis-Aligned Bounding Box)(轴对齐包围盒)(也就是对齐xyz轴的盒子 并不会旋转)简称aabb包围盒

如何判断光线和包围盒的求交

在这里插入图片描述
包围盒就会在这个模型的最大值那产生三对对面 包围住模型 对面就是图中看到的那两个比较大的 叫一对对面
在这里插入图片描述

而我们在判断一个光线什么时候进入包围盒的时候我们就先分别从x,y,z方向去算进入和离开对面的时间(从射线原点往后走 相交到的交点就是负的值)
就会得到3对进入和离开的时间

什么时候才算真正进入了包围盒

就是三个对面都进入了的时间

什么时候才算真正离开了包围盒

就是只要离开了其中一个对面的时间

真正在包围盒内的时间

就是取 三个进入时间中的最大值 三个离开时间中的最小值
对三个时间段取交集

可能出现的情况

最终取到的两个时间段里
进入时间<0 离开时间<0 :射线最开始就在包围盒的前面 永远不会经过包围盒
进入时间<0 离开时间>0 :射线最开始就在包围盒内部
进入时间>0 离开时间>0 :射最开始就在包围盒的后面 一定会经过包围盒

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值