光线追踪—层次包围盒( Bounding Volume Hierarchies )

原理:
通过一个简单的包围盒把物体包围起来,射线和场景中的物体求交之前,会先和这个包围盒进行求交,如果该射线没有碰到该包围盒,表明该直线一定不会和包围盒里的物体相交;如果该射线碰到该包围盒,那么再来计算射线是否和包围盒中的物体相交。
作用:
BVH可以使渲染器更加高效,值得注意的是盒子是可以重叠的。当然,盒子内也可以放其他的盒子,这样我们会得到一个树形结构。
怎样判断和盒子是否相交?
2D包围盒的边界是一条线,而3D包围盒的边界是一个面
射线可以看为是一个方程:P(t)=A+B*t
将这个公式实际应用
在这里插入图片描述
实现步骤:
1.修改Vector3D,Point3D中的代码,方便接下来的索引操作(对于索引器的操作:索引值为0返回x,值为1返回y,值为2返回z。)

public class Vector3D
    {
   
        public double[] data = new double[3];
        public double this[int index]
        {
   
            get => data[index];
            set => data[index] = value;
        }
        private double _x;
        private double _y;
        private double _z;
        public double X
        {
   
            get => data[0];
            set => data[0] = value;
        }
         public double Y
        {
   
            get => data[1];
            set => data[1] = value;
        }
        public double Z
        {
   
            get => data[2];
            set => data[2] = value;
        }
        //...省略其他代码...//
  }

2.创建AABB包围盒的类

public class AABB
    {
   
        Vector3D _min;
        Vector3D _max;
        public AABB()
        {
   
        }
        public AABB(Vector3D a,Vector3D b)
        {
   
            _min = a;
            _max = b;
        }
        public Vector3D Min {
    get => _min; set => _min = value; }
        public Vector3D Max {
    get => _max; set => _max = value; }
         public bool hit(Ray r, double tmin,double tmax) 
        {
   
            for (var a = 0;
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值