首页 > 其他分享 >games101_Homework6

games101_Homework6

时间:2024-04-14 22:34:04浏览次数:25  
标签:std node const dirIsNeg xzy games101 Homework6 ray

实现 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;
}
View Code

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;
}
View Code

效果图

 

标签:std,node,const,dirIsNeg,xzy,games101,Homework6,ray
From: https://www.cnblogs.com/wosun/p/18134823

相关文章

  • Intel MacBook Pro+macOS 14配置Games101实验环境
    参考:求一个games101图形学课程的环境配置教程,最好能够简单易懂,CSDN教程根本看不懂什么意思?-不泊的回答-知乎https://www.zhihu.com/question/459126051/answer/3420947842macos现在怎么装homebrew?-MyloZ的回答-知乎https://www.zhihu.com/question/340411846/answe......
  • 04 games101-变换(模型、视图、投影)
    04变换(模型、视图、投影)MVP变换MVP变换用来描述视图变换的任务,即将虚拟世界中的三维物体映射(变换)到二维坐标中。MVP变换分为三步:●模型变换(modeltranformation):将模型空间转换到世界空间(找个好的地方,把所有人集合在一起,摆个pose)●摄像机变换(viewtranformation):将......
  • 06 games101-光栅化(深度测试与抗锯齿)
    06光栅化(深度测试与抗锯齿)从采样分析走样采样的对象:●在位置上采样——照片●在时间上采样——视频以下副标题均是在时域上分析。采样的瑕疵(Artifacts)Artifacts(Erros/Mistakes/Inaccuracies)●锯齿●摩尔纹●车轮效应●…走样的原因信号频率太快,采样太......
  • 05 games101-光栅化(三角形的离散化)
    05光栅化(三角形的离散化)三角形三角形的性质和优点:●最基础的多边形●其他图形可以拆解为三角形●三角形内一定是平面●内外的定义很明确●定义三个顶点后,三角形内可以插值光栅化(Rasterization)光栅化关键:判断一个像素和三角形的位置关系(像素中心点与三角形的位......
  • games101_Homework3
    摘要:在Raster部分实现数值插值,然后实现四种不同的像素着色器作业描述:作业1:修改函数rasterize_triangle(constTriangle&t)inrasterizer.cpp:在此处实现与作业2类似的插值算法,实现法向量、颜色、纹理颜色的插值。在rasterize_triangle函数中重复上次的包围盒进行点采样,......
  • games101_Homework4
    摘要:实现四个点的贝塞尔曲线作业描述:•bezier:该函数实现绘制Bézier曲线的功能。它使用一个控制点序列和一个OpenCV::Mat对象作为输入,没有返回值。它会使t在0到1的范围内进行迭代,并在每次迭代中使t增加一个微小值。对于每个需要计算的t,将调用另一个函数recursive......
  • GAMES101 Rasterization 光栅化
    向量点乘的作用计算两个方法方向夹角计算两个方向是否接近关于两个方向的计算向量叉乘\[\vec{a}\times\vec{b}=\begin{pmatrix}y_az_b-y_bz_a\\z_ax_b-x_az_b\\x_ay_b-y_ax_b\end{pmatrix}\]\[\veca\times\vecb=A^*b=\begin{pmatrix}0&-z_a&y_a\\z_a&0&-x_a\\-y_a&x......
  • games101_Homework1
    作业描述:本次作业的任务是填写一个旋转矩阵和一个透视投影矩阵。给定三维下三个点v0(2.0,0.0,−2.0),v1(0.0,2.0,−2.0),v2(−2.0,0.0,−2.0),你需要将这三个点的坐标变换为屏幕坐标,并在屏幕上绘制出对应的线框三角形(在代码框架中,我们已经提供了draw_triangl......
  • games101_Homework0
    作业描述:给定一个点P=(2,1),将该点绕原点先逆时针旋转45◦,再平移(1,2),计算出变换后点的坐标(要求用齐次坐标进行计算)。作业解答:#include<cmath>#include<eigen3/Eigen/Core>#include<eigen3/Eigen/Dense>#include<iostream>intmain(){//definepoin......
  • games101-2 透视深度插值矫正与抗锯齿分析
    透视深度插值矫正与抗锯齿分析深度插值的差错原因透视深度插值公式推导games101中的错误msaa与ssaa简要定义games101中ssaa的实现games101中msaa的实现深度插值的差错原因当投影的图形与投影的平面不平行时,这时进行透视投影,从上图中可以看出,投影平面上的线段时均匀......