Games101-作业5
说明
本次作业主要实现Whitted-光线追踪,作业框架只需要我们编写两个部分,一个是求解观测光线--从摄像机到每个像素的向量;第二个是判断射线与三角形的交点。
求解观测光线
需要对每个像素求解在实际物体空间中的向量,然后利用从摄像机到该像素位置定义一条入射光线。
首先需要知道光栅化屏幕大小是
现在是已知(width,height)上一点,求解该点对应实际物体的位置。
- 变换到(0,1)范围,这一步就是简单的数值缩放处理,以x为例
- 变换到(-1,-1)空间,这一步x与y稍微有点区别,在于x的(0,1)范围是沿着x正向的,而y的(0,1)范围是沿着y负向的,所以为了最后得到的图像方向朝上,需要使用-y
- (-1,-1)变换到实际的投影平面即(x,y)并不一定是一个正方形,利用宽高比
来求解
- 利用FOV求解y在znear上的实际位置,在代码中假设了eyepos到znear的距离为1
Vector3f dir = Vector3f(x, y, -1); == Vector3f(x, y, -1)-eyepos
所以有
最终该部分代码就是
x = (2.0*(i+0.5)/scene.width-1.0)*scale*(1.0*imageAspectRatio);
y = (1.0-2.0*(j+0.5)/scene.height)*scale;
Vector3f dir = Vector3f(x, y, -1); // Don't forget to normalize this direction!
dir = normalize(dir);
判断射线与三角形的交点
if(tnear>=0 && u >=0 && v >=0 && (1-u-v)>=0) return true;
tnear 即为射线o+td的t
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~