太极图形课S1第07讲:光线追踪实战

太极图形课S1第07讲:光线追踪实战_哔哩哔哩_bilibili

没有代码,还是上一节的代码

看了别的大佬写的很多好看的图形学程序,就有那么一种感觉——我这个小白之所以这么白,全方位的白,是因为没有相关的数理知识作核。而图形编程只是一层壳,是次要方面。

抓不到主要方面,当然白啦!

不过,如果我要是能学得会数理知识,我高考能考成那样吗……

已经习惯被大佬按在地上去摩擦了……不习惯又能怎么样呢?就不是那块料。。

就这样吧,凑凑热闹,感动一下自己……自我感动形学习……

自我感动形学习也比自我放弃形躺平要好听一点,至少学了一点,万一学的这一点以后用上了呢?

正文

绕过辐射度量学,说清楚光线到底追到了什么颜色

回顾

图形学的这个图形的颜色,其实是颜色+亮度

  • 颜色:可以当成一个过滤器,比如白光射入红墙,反射以后,多余的颜色被过滤,就只剩了红光
  • 强度:严格来说,应该叫辐照度,能量,单位立体角什么的,流明
  • 光追,多次反射,那就多乘几次【弹幕:亮度是有单位的,连乘之后量纲就不对了,颜色可以被认为是个过滤器/衰减器】

 代码

问题的提出 

今天主要看“实现”,实现的话,就有这么几个问题:

如何发射光?

如何计算光线与物体的交点?

漫反射表面,介电质表面,如何取光线的方向?

如何化递归为非递归?

如何反走样?

 正式开始:

问题1——如何发射光?

一条直线,可以按射线来定义

定义了很多值:

发光:

可以按像素中心算,不一定都要按左下角来算

 问题2——如何计算光线与物体的交点?

解方程。。

都定义成数学,然后计算

联立,解方程

 射线与球的交点的计算,可能会计算出一些奇奇怪怪的东西

比如,两个正根,一正一负,两个负根

取最小的那个正根就行了

 把这些东西具体实现出来,是这个:、

会发现,结果很奇怪

 为什么?

因为数学上的理论计算,和实际上的硬件实现,有时候不大一样。

理论计算:【0,2】的时候,取最小的正根——取2,和第二个球相交,没毛病

硬件实现:【0.0001,1.9999】的时候,取最小的正根——取0.0001,和自己相交,凉凉……

【弹幕:因为有靠近0的根的时候,因为数值精度问题,会偶尔返回给你一个正根,偶尔返回一个负根(都很小),就会出现相交判定时灵时不灵】

解决方法——把最小的正根,改成,最小的大于0.001的根

【弹幕:有一个trick是计算求交时把射线起点稍微往后退一点。——这玩意原来用过的】

然后,这个问题就可以解决了

还有个问题,墙壁如何求交?——其实,这个所谓的平面墙壁,是半径很大的几个球的一部分

正规的,与平面求交应该这么计算:

有了平面以后,还可以再扩展,扩展到与三角形求交

因为,三角形总是在某个平面上的

重心坐标,面积关系,可以判断某点是否在三角形内,与上面的结合一下,就完成了射线与三角形的求交

 与三角形求交,有这么个应用:

 问题3——如何采样

 新的坐标系的定义:

 可以均匀采样一个球

 忽略R=1,三维球坐标就转化成了二维坐标,把这些二维散点映射到球上的时候,两极的点会密一些

所以,地球仪的两极,看着比较虚大。

重新定义球的均匀采样:

推导看不懂可以忽略。。

最后结果是这个:

θ在赤道多采一些,在两极少采一些

 

 球体里采样,R也要变,才能保证采样是均匀的

【弹幕:为啥要对r采样开三次方,0~1之间随机不行吗】

【如果不开三次方会采出中心采样多,外面采样少的情况。】

【概率密度函数,求法很简单, 讲实际分布函数取逆函数就好了。 了解这个知识的人的确很少】

【想象一个半径为r的球,把它的半径增加微小量dr之后,球体体积的变化量和r^3成正比】

还有另一种方法:按方块采样,不按球采样,简单一点

结束了吗?

够用,但是还可以再改

加点权重? 

 【成正比的线性函数,算来算去后,对密度函数的调整就是求开方。】

 球面上采样,再投影回去

 【学会放弃……】

在球体里采样,和在球面上采样

 这玩意,不好调试

 问题4——反射与折射与介电质

 全反射。。

 还有个问题——反射和折射,都占多少?

 【菲涅尔效应】

 数学公式……

和入射角,两个光疏光密介质有关

 

 整合一下:

 问题5——递归

 函数调用与递归工作栈

 

 尾递归,和ray trace差不多……可以改成循环

不用手动维护一个堆栈了

 然后,按这个原理来改写:

 大概是这么个流程

 问题6——抗锯齿反走样

这个就叫锯齿

 可以这么搞,多采样几次

 效果

 

 

 

光线跟踪到光源的时候,才能知道它是什么颜色

所以,可以摄像机,光源,两头一起计算。。

还是大神。。

 讲path trace代码的一个环节

太极图形课S1第07讲:光线追踪实战_哔哩哔哩_bilibili

这还有一个模拟太阳系的大佬

太极图形课S1第07讲:光线追踪实战_哔哩哔哩_bilibili

我能模拟小白。。因为我就是小白。唉…… 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用turtle库可以绘制太极图。以下是一个使用turtle库绘制太极图的完整代码: ```python import turtle window = turtle.Screen() bage = turtle.Turtle() radius = 100 bage.width(3) bage.color("black", "black") bage.begin_fill() bage.circle(radius/2, 180) bage.circle(radius, 180) bage.left(180) bage.circle(-radius/2, 180) bage.end_fill() bage.left(90) bage.up() bage.forward(radius*0.35) bage.right(90) bage.down() bage.color("white", "white") bage.begin_fill() bage.circle(radius*0.15) bage.end_fill() bage.left(90) bage.up() bage.backward(radius*0.7) bage.down() bage.left(90) bage.color("black", "black") bage.begin_fill() bage.circle(radius*0.15) bage.end_fill() bage.right(90) bage.up() bage.backward(radius*0.65) bage.right(90) bage.down() bage.circle(radius, 180) bage.ht() window.exitonclick() ``` 这段代码使用turtle库创建了一个窗口,并创建了一个名为bage的海龟对象。通过调用海龟对象的方法和属性,可以绘制太极图。首先设置海龟的宽度和颜色,然后使用`circle`方法绘制半圆和圆来构建太极图的两个部分。接着调整海龟的位置和方向,使用`circle`方法绘制两个小圆来表示太极图的阴阳部分。最后隐藏海龟对象并等待用户点击窗口关闭。 运行这段代码,就可以在窗口中看到绘制的太极图。 #### 引用[.reference_title] - *1* *2* [python绘图:turtle画太极图](https://blog.csdn.net/gouxf_0219/article/details/84396581)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值