Games101-作业5
说明
本次作业主要实现Whitted-光线追踪,作业框架只需要我们编写两个部分,一个是求解观测光线--从摄像机到每个像素的向量;第二个是判断射线与三角形的交点。
求解观测光线
需要对每个像素求解在实际物体空间中的向量,然后利用从摄像机到该像素位置定义一条入射光线。
首先需要知道光栅化屏幕大小是\(width*height\),而物体所进行的变换是从实际空间变为(-1,-1,-1)3D空间,再变换投影到(0,1)2D平面,最后根据(0,1) 到 (width,height)的转换进行光栅化。
现在是已知(width,height)上一点,求解该点对应实际物体的位置。
- 变换到(0,1)范围,这一步就是简单的数值缩放处理,以x为例
0<x<width \\
0<\frac{x}{width}<1
\end{align}
\]
- 变换到(-1,-1)空间,这一步x与y稍微有点区别,在于x的(0,1)范围是沿着x正向的,而y的(0,1)范围是沿着y负向的,所以为了最后得到的图像方向朝上,需要使用-y
-1 < 2\cdot \frac{x}{width}-1 < 1\\
-1 < 1-2\cdot \frac{y}{height} < 1
\end{align}
\]
- (-1,-1)变换到实际的投影平面即(x,y)并不一定是一个正方形,利用宽高比\(ratio = \frac{x}{y}\)来求解
-ratio < (2\cdot \frac{x}{width}&-1)\cdot ratio < ratio\\
-1 < 1-2\cdot &\frac{y}{height} < 1
\end{align}
\]
- 利用FOV求解y在znear上的实际位置,在代码中假设了eyepos到znear的距离为1
Vector3f dir = Vector3f(x, y, -1); == Vector3f(x, y, -1)-eyepos
所以有
-x < (2\cdot \frac{x}{width}&-1)\cdot ratio\cdot scale(FOV) < x \\
-y < (1-2\cdot &\frac{y}{height}) \cdot scale(FOV) < y
\end{align}
\]
最终该部分代码就是
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);
判断射线与三角形的交点

根据计算出来的\(t,b_1,b_2\)判断点是否在三角形内,
if(tnear>=0 && u >=0 && v >=0 && (1-u-v)>=0) return true;
tnear 即为射线o+td的t
Games101-作业5的更多相关文章
- GAMES101作业2
作业任务: 填写并调用函数 rasterize_triangle(const Triangle& t). 即实现光栅化 该函数的内部工作流程如下: 创建三角形的 2 维 bounding bo ...
- 【UE4】GAMES101 图形学作业2:光栅化和深度缓存
总览 在上次作业中,虽然我们在屏幕上画出一个线框三角形,但这看起来并不是那么的有趣.所以这一次我们继续推进一步--在屏幕上画出一个实心三角形,换言之,栅格化一个三角形.上一次作业中,在视口变化之后,我 ...
- 【UE4】GAMES101 图形学作业5:光线与物体相交(球、三角面)
总览 在这部分的课程中,我们将专注于使用光线追踪来渲染图像.在光线追踪中最重要的操作之一就是找到光线与物体的交点.一旦找到光线与物体的交点,就可以执行着色并返回像素颜色. 在这次作业中,我们要实现两个 ...
- 【UE4】GAMES101 图形学作业4:贝塞尔曲线
总览 Bézier 曲线是一种用于计算机图形学的参数曲线. 在本次作业中,你需要实现de Casteljau 算法来绘制由4 个控制点表示的Bézier 曲线(当你正确实现该算法时,你可以支持绘制由更 ...
- 【UE4】GAMES101 图形学作业3:Blinn-Phong 模型与着色
总览 在这次编程任务中,我们会进一步模拟现代图形技术.我们在代码中添加了Object Loader(用于加载三维模型), Vertex Shader 与Fragment Shader,并且支持了纹理映 ...
- 【UE4】GAMES101 图形学作业1:mvp 模型、视图、投影变换
总览 到目前为止,我们已经学习了如何使用矩阵变换来排列二维或三维空间中的对象.所以现在是时候通过实现一些简单的变换矩阵来获得一些实际经验了.在接下来的三次作业中,我们将要求你去模拟一个基于CPU 的光 ...
- 【UE4】GAMES101 图形学作业0:矩阵初识
作业描述 给定一个点P=(2,1), 将该点绕原点先逆时针旋转45◦,再平移(1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算). UE4 知识点 主要矩阵 FMatrix FBasisVec ...
- python10作业思路及源码:类Fabric主机管理程序开发(仅供参考)
类Fabric主机管理程序开发 一,作业要求 1, 运行程序列出主机组或者主机列表(已完成) 2,选择指定主机或主机组(已完成) 3,选择主机或主机组传送文件(上传/下载)(已完成) 4,充分使用多线 ...
- SQLServer2005创建定时作业任务
SQLServer定时作业任务:即数据库自动按照定时执行的作业任务,具有周期性不需要人工干预的特点 创建步骤:(使用最高权限的账户登录--sa) 一.启动SQL Server代理(SQL Server ...
- 使用T-SQL找出执行时间过长的作业
有些时候,有些作业遇到问题执行时间过长,因此我写了一个脚本可以根据历史记录,找出执行时间过长的作业,在监控中就可以及时发现这些作业并尽早解决,代码如下: SELECT sj.name , ...
随机推荐
- MySQL 8.0.25从节点自动故障转移测试
从MySQL 8.0.23开始,复制结构中,增加了从节点自动故障转移功能.测试一下起功能: 用dbdeployer快速安装测试环境,我这边安装的是:dbdeployer1.8.5 -- 安装脚本 ...
- IoT(Internet of things)物联网入门介绍
1.什么样的物可以入网? 要有数据传输通路 要有一点的存储功能 要有CPU 要有操作系统 要有专门的应用程序 遵循物联网的通信协议 在网络世界中有可被识别的唯一编号 2.MQTT协议 不是在说物联网吗 ...
- 文心一言 VS 讯飞星火 VS chatgpt (201)-- 算法导论15.2 6题
六.用go语言,证明:对 n 个元素的表达式进行完全括号化,恰好需要 n-1 对括号. 文心一言,代码正常运行: 在Go语言中,证明对n个元素的表达式进行完全括号化恰好需要n-1对括号,可以通过数学归 ...
- 【LeetCode二叉树#14】验证二叉搜索树(巩固迭代中序遍历#1)
验证二叉搜索树 力扣题目链接(opens new window) 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子 ...
- 【LeetCode栈与队列#02】有效括号
有效括号 力扣题目链接(opens new window) 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右 ...
- 【Azure App Services】多次操作App Service伸缩实例遇见限制操作记录
问题描述 多次操作App Services,进行实例数的变化.达到限制后遇见报错: 错误的具体描述为: { "status": "Failed", " ...
- 基于 Nebula Graph 构建图学习能力
本文首发于 Nebula Graph Community 公众号 经常看技术文章的小伙伴可能会留意到除了正在阅读的那篇文章,在文章页面的正文下方或者右侧区域会有若干同主题.同作者的文章等你阅读:经常逛 ...
- Advanced .Net Debugging 3:基本调试任务(上)
一.简介 这是我的<Advanced .Net Debugging>这个系列的第三篇文章.这个系列的每篇文章写的周期都要很长,因为每篇文章都是原书的一章内容(太长的就会分开写).再者说,原 ...
- Jmeter Xpath提取器你了解多少?
- SpringCloudStream消息驱动
1. 基本介绍 官方文档: https://spring.io/projects/spring-cloud-stream#learn 背景: 在一般的大型项目中,或者分布式微服务结构的系统里,一般都会 ...