首页 > 其他分享 >0202-透明材质的折射

0202-透明材质的折射

时间:2024-07-22 09:32:39浏览次数:14  
标签:0202 1.0 temp 0.0 折射 let pub new 材质

环境

  • Time 2022-11-16
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html

目标

再新增一种材质,实现折射功能。

增加朝向

pub struct HitRecord {
    pub point: Point3,
    pub normal: Vector3,
    pub t: f64,
    pub material: Rc<dyn Material>,
    pub face: bool,
}

设置朝向

fn nearest(&self, ray: &Ray, temp: Temp) -> Option<HitRecord> {
    //  找到最近的点
    let a = ray.direction().dot(ray.direction());

    let mut t = (-temp.b - temp.sqrt) / a;
    if t < temp.min || temp.max < t {
        t = (-temp.b + temp.sqrt) / a;
        if t < temp.min || temp.max < t {
            return None;
        }
    }

    let point = ray.at(t);
    let mut normal = (point - self.center) / self.radius;

    let face = ray.direction().dot(normal) < 0.0;
    if !face {
        normal = (-1.0) * normal
    };
    Some(HitRecord {
        t,
        point,
        normal,
        material: Rc::clone(&self.material),
        face,
    })
}

增加材质

pub struct Dielectric {
    // 折射率
    refraction: f64,
}

impl Dielectric {
    pub fn new(refraction: f64) -> Dielectric {
        Dielectric { refraction }
    }

    // 折射
    fn refract(uv: Vector3, n: Vector3, f: f64) -> Vector3 {
        let cos_theta = ((-1.0) * uv).dot(n).min(1.0);
        let r = f * (uv + cos_theta * n);
        r - (1.0 - r.dot(r)).abs().sqrt() * n
    }
}

impl Material for Dielectric {
    fn scatter(&self, ray: &Ray, record: &HitRecord) -> Option<(Color, Ray)> {
        let ratio = match record.face {
            true => 1.0 / self.refraction,
            false => self.refraction,
        };

        let direction = ray.direction().unit();
        let refracted = Self::refract(direction, record.normal, ratio);
        let scattered = Ray::new(record.point, refracted);

        Some((Color::new(1.0, 1.0, 1.0), scattered))
    }
}

显示

let ground = Rc::new(Lambert::new(Color::new(0.8, 0.8, 0.0)));
let center = Rc::new(Dielectric::new(1.5));
let left = Rc::new(Dielectric::new(1.5));
let right = Rc::new(Metal::new(Color::new(0.8, 0.6, 0.2), 1.0));

let world: World = vec![
    Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0, ground)),
    Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5, center)),
    Box::new(Sphere::new(Point3::new(-1.0, 0.0, -1.0), 0.5, left)),
    Box::new(Sphere::new(Point3::new(1.0, 0.0, -1.0), 0.5, right)),
];

效果

折射

总结

新增了折射功能。

附录

标签:0202,1.0,temp,0.0,折射,let,pub,new,材质
From: https://www.cnblogs.com/jiangbo4444/p/18315378

相关文章

  • 0203-透明材质的反射
    环境Time2022-11-17WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标实现透明材质的反射功能。DielectricimplDielectric{pubfnnew(refraction:f64)->Dielectric{Dielectric{re......
  • 0200-材质和散射
    环境Time2022-11-16WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标不同的材质有不同的散射光线和衰减,这一节将不同的材质进行抽象。向量的乘法implMulforVector3{typeOutput=Self;f......
  • UE4材质笔记
    常用节点:添加贴图:TextureSample(贴图采样)常量数字:Constant(数字)Vector或长按数字并点击左键乘法:Multiply或长按M并点击左键常用插值:Lerp或长按L并点击左键加法:Add或者长按A键并点击左键减法:Subtract除法:Divide或者长按D键并点击左键1-x:搜索1-或者oneminus或者长按O键并点击左键绝......
  • JMonkeyEngine——材质文件备注
    默认J3M编辑器不支持编辑纹理参数的Mag/Min滤波选项,只能配置Flip和Wrap模式,但是可以单独编辑J3M源码,如下: 添加你需要的Mag/Min滤波选项,参考源码的解析,就是Mag/Min+拼接对应的Filter值。虽然打开J3M编辑器会报错: 但实际进游戏时并不会报错,而且一切正常,如下: 所以可以正常......
  • blender常用材质参数
    Blender中材质的以下关键属性:基础色(BaseColor),金属度(Metallic),粗糙度(Roughness),IOR折射率(IOR),Alpha(Alpha),法向(Normal),次表面(Subsurface),高光(specular),透射(Transmission),涂层(Coat),边缘光泽(Sheen),自发光(Emission)请给出简约的白色T恤关于以上属性的各个值......
  • Cesium 实战 - 自定义纹理材质系列之 - 涟漪效果
    Cesium实战-自定义纹理材质系列之-涟漪效果核心代码完整代码在线示例Cesium给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求;但是作为WebGL引擎,肯定不够丰富,尤其是动态效果样式。对于实体对象(Entity),可以通过自定义材质,实现各种动态效果,虽......
  • Cesium 实战 - 自定义纹理材质系列之 - 动态扩散效果
    Cesium实战-自定义纹理材质系列之-动态扩散效果核心代码完整代码在线示例Cesium给实体对象(Entity)提供了很多实用的样式,基本满足普通项目需求;但是作为WebGL引擎,肯定不够丰富,尤其是动态效果样式。对于实体对象(Entity),可以通过自定义材质,实现各种动态效......
  • PixPlant.5.0.42_x64破解汉化版,创建平铺 3D 材质的更好方法
    PixPlant5是一款功能强大的贴图生成器,可用于快速生成高质量的纹理贴图,下面分享PixPlant5贴图生成器的使用方法。1、在网上找到需要的贴图类型,如丝绸,木板,砖块,纺织物等任意需要的贴图。2、找到贴图后打开PS,将贴图设置为长宽相同尺寸的图片,如以下设置为500×500像素,如贴图使......
  • 制作耳机壳的UV树脂和塑料材质相比优势有哪些?
    制作耳机壳的UV树脂和塑料材质相比优势有哪些?制作耳机壳的UV树脂相比塑料材质有以下优势:高强度与耐磨性:UV树脂具有高强度和耐磨性,能够更好地保护耳机内部零件,延长耳机使用寿命。相比之下,塑料材质可能较易磨损或刮伤。耐高温:UV树脂具有较好的耐高温性能,即使在炎热的环境中也......
  • 技术革新引领钢材质量智能化检测新纪元,基于YOLOv3全系列【yolov3tiny/yolov3/yolov3sp
    随着人工智能(AI)技术的迅猛发展,其应用领域不断拓宽,正深刻改变着传统产业的运作模式。在钢材生产这一基础工业领域,AI的引入正为钢材的质量检测带来革命性的变革。在传统的钢材生产流程中,质量检测是确保产品质量的关键环节。然而,这一环节长期以来主要依赖于经验丰富的工人通过肉......