games101_Homework6
实现 Ray-Bounding Volume 求交与 BVH 查找
在本次编程练习中,你需要实现以下函数:
• IntersectP(const Ray& ray, const Vector3f& invDir, const std::array<int, 3="">& dirIsNeg) in the Bounds3.hpp: 这个函数的 作用是判断包围盒 BoundingBox 与光线是否相交,你需要按照课程介绍的算 法实现求交过程。
• getIntersection(BVHBuildNode* node, const Ray ray)in BVH.cpp: 建 立 BVH 之后,我们可以用它加速求交过程。该过程递归进行,你将在其中调 用你实现的 Bounds3::IntersectP.
IntersectP(const Ray& ray, const Vector3f& invDir, const std::array<int, 3="">& dirIsNeg)

inline bool Bounds3::IntersectP(const Ray& ray, const Vector3f& invDir,
const std::array<int, 3>& dirIsNeg) const
{
// invDir: ray direction(x,y,z), invDir=(1.0/x,1.0/y,1.0/z),
// use this because Multiply is faster that Division
// dirIsNeg: ray direction(x,y,z), dirIsNeg=[int(x>0),
// int(y>0),int(z>0)], use this to simplify your logic
// TODO test if ray bound intersects Vector3f t_enter_xzy = (pMin - ray.origin) * invDir;
Vector3f t_exit_xzy = (pMax - ray.origin) * invDir;
// 如果光线在某一个轴上的分量是负数,则对应轴上的面越大越先进入
if(!dirIsNeg[0]) std::swap(t_enter_xzy.x, t_exit_xzy.x);
if(!dirIsNeg[1]) std::swap(t_enter_xzy.y, t_exit_xzy.y);
if(!dirIsNeg[2]) std::swap(t_enter_xzy.z, t_exit_xzy.z); float tenter = std::max(std::max(t_enter_xzy.x, t_enter_xzy.y), t_enter_xzy.z);
float texit = std::min(std::min(t_exit_xzy.x, t_exit_xzy.y), t_exit_xzy.z); return tenter < texit && texit >= 0;
}
getIntersection(BVHBuildNode* node, const Ray ray)

Intersection BVHAccel::getIntersection(BVHBuildNode* node, const Ray& ray) const
{
Intersection res;
// TODO Traverse the BVH to find intersection // 如果光线与改包围盒无交点,直接返回false的res
if(!node->bounds.IntersectP(ray, ray.direction_inv, std::array<int, 3>
{ray.direction.x > 0, ray.direction.y > 0, ray.direction.z > 0})){
return res;
}
// 如果当前节点为叶子节点,遍历node中的每一个物体使之于光线求交
if(node->object){
return node->object->getIntersection(ray);
} // 如果当前节点的盒子与光线相交则分别递归到左右
Intersection l = getIntersection(node->left, ray);
Intersection r = getIntersection(node->right, ray); //如果有两个交点,返回较近的那个交点
return l.distance <= r.distance ? l : r;
}
效果图

随机推荐
- 【Linux驱动】充电芯片bq24735调试详解
一.bq24735简介 bq24735 是一款高效率同步电池充电器. 当系统供电需求暂时高于适配器最大供电水平的时候, bq24735 使用智能加速技术来允许电池向系统中释放能量,这样的话将保护适配器 ...
- [rCore学习笔记 025]分时多任务系统与抢占式调度
写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 本节重 ...
- MacPorts 使用
安装 安装苹果命令行开发工具: xcode-select --install 下载并打开 MacPorts 安装包. 使用 MacPorts 中的软件包称为 port. sudo port selfu ...
- JWT(JSON WEB TOKEN)是玩具吗
JWT当然不是玩具,理解其设计意图,和适用场景自然会发现存在的就是有价值的 JWT: JSON Web Token 起源和定义 JWT(JSON Web Token)是由 IETF(Internet ...
- MySQL Installer 方式安装MySQL
一.下载MySQL 首先,去数据库的官网https://dev.mysql.com/downloads/windows/installer/8.0.html下载MySQL. 点击download进入下 ...
- 探索 Nuxt Devtools:功能全面指南
title: 探索 Nuxt Devtools:功能全面指南 date: 2024/9/3 updated: 2024/9/3 author: cmdragon excerpt: 摘要:本文介绍了Nu ...
- 解决使用filter: blur时图片四周泛白的问题
发现问题 在使用filter: blur(15px)模糊背景图时,发现图片周围会泛白. 解决问题 查了好多办法: 1.使用StackBlur.js处理图片模糊. 2.改变background-size ...
- C# WinForm避免程序重复启动,限制程序只能运行一个实例【转】
记录一下,原文:https://blog.csdn.net/xggbest/article/details/104231935 禁止多个进程运行,当重复运行时激活以前的进程 Program.cs: u ...
- 【YashanDB数据库】YashanDB如何回收表空间
确认表空间高水位线,是否有可回收空间. select a.tablespace_name,a.high_water_mark,b.user_bytes,b.total_bytes from (SELE ...
- Qt表格入门
摘要 表格作为数据展示的界面,会在很多场景下使用.Qt为我们提供了使用简单方便和扩展性强的表格视图,这里做一个简单的入门整理. 个人能力有限,有错误欢迎留言指正,如果你有更好的方法,也 ...