首页 > 其他分享 >0206-生成最终图像

0206-生成最终图像

时间:2024-07-22 09:29:52浏览次数:6  
标签:world 0.0 rng 生成 0206 sphere let 图像 new

环境

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

前言

说明

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

目标

将之前的所有的内容合并在一起生成一个最终的图像。

vector3.rs

    pub fn random(range: Range<f64>) -> Vector3 {
        let mut rng = rand::thread_rng();
        Vector3 {
            x: rng.gen_range(range.clone()),
            y: rng.gen_range(range.clone()),
            z: rng.gen_range(range),
        }
    }

生成场景

fn random_scene() -> World {
    let mut rng = rand::thread_rng();
    let mut world = World::new();

    let ground = Rc::new(Lambert::new(Color::new(0.5, 0.5, 0.5)));
    let ground = Sphere::new(Point3::new(0.0, -1000.0, 0.0), 1000.0, ground);

    world.push(Box::new(ground));

    for a in -11..=11 {
        for b in -11..=11 {
            let choose_mat: f64 = rng.gen();
            let center = Point3::new(
                (a as f64) + rng.gen_range(0.0..0.9),
                0.2,
                (b as f64) + rng.gen_range(0.0..0.9),
            );

            if choose_mat < 0.8 {
                let albedo = Color::random(0.0..1.0) * Color::random(0.0..1.0);
                let sphere_mat = Rc::new(Lambert::new(albedo));
                let sphere = Sphere::new(center, 0.2, sphere_mat);

                world.push(Box::new(sphere));
            } else if choose_mat < 0.95 {
                let albedo = Color::random(0.4..1.0);
                let fuzz = rng.gen_range(0.0..0.5);
                let sphere_mat = Rc::new(Metal::new(albedo, fuzz));
                let sphere = Sphere::new(center, 0.2, sphere_mat);

                world.push(Box::new(sphere));
            } else {
                // Glass
                let sphere_mat = Rc::new(Dielectric::new(1.5));
                let sphere = Sphere::new(center, 0.2, sphere_mat);

                world.push(Box::new(sphere));
            }
        }
    }

    let mat1 = Rc::new(Dielectric::new(1.5));
    let mat2 = Rc::new(Lambert::new(Color::new(0.4, 0.2, 0.1)));
    let mat3 = Rc::new(Metal::new(Color::new(0.7, 0.6, 0.5), 0.0));

    let sphere1 = Sphere::new(Point3::new(0.0, 1.0, 0.0), 1.0, mat1);
    let sphere2 = Sphere::new(Point3::new(-4.0, 1.0, 0.0), 1.0, mat2);
    let sphere3 = Sphere::new(Point3::new(4.0, 1.0, 0.0), 1.0, mat3);

    world.push(Box::new(sphere1));
    world.push(Box::new(sphere2));
    world.push(Box::new(sphere3));

    world
}

相机和图像

    const RATIO: f64 = 3.0 / 2.0;
    const WIDTH: u64 = 1200;
    const HEIGHT: u64 = ((WIDTH as f64) / RATIO) as u64;
    const SAMPLES_PER_PIXEL: u64 = 500;
    const MAX_DEPTH: u64 = 50;

    let world = random_scene();

    let camera = Camera::new(
        Point3::new(13.0, 2.0, 3.0),
        Point3::new(0.0, 0.0, 0.0),
        Vector3::new(0.0, 1.0, 0.0),
        20.0,
        RATIO,
        0.1,
        10.0,
    );

效果

最终图像

总结

生成了最终的图像。在做的过程中,很多的公式和原理弄不清楚。
只能跟着流程往下走,其余的没有弄懂,图形学还是太难了。

附录

源码

https://github.com/jiangbo/game/tree/main/rust/ray-tracing

标签:world,0.0,rng,生成,0206,sphere,let,图像,new
From: https://www.cnblogs.com/jiangbo4444/p/18315397

相关文章

  • 使用python图像去噪没有获得所需的重建图像
    我是python机器学习的初学者,我正在编写一个程序,使图像变得嘈杂,然后我的程序输出重建的图像。我正在使用加性高斯白噪声并使用前馈神经网络。我的程序显示真实图像、噪声图像和重建图像。这些是我通常得到的结果。有人知道如何解决这样的问题吗?这是我的代码:ap......
  • 如何在 MacOS 上生成跟随鼠标的绿色方块?
    我正在尝试编写一个python应用程序,它生成一个没有填充的绿色方块,跟随我的光标。我希望这个正方形始终可见,所以用CSS术语来说,我希望它的z-index最大。我想实现这一点的方法是:首先实现一个不断检索我的光标位置的重复方法。在它旁边生成一个绿色方块。......
  • 如何立即取消使用 Ollama Python 库生成答案的 Asyncio 任务?
    我正在使用Ollama通过OllamaPythonAPI从大型语言模型(LLM)生成答案。我想通过单击停止按钮取消响应生成。问题在于,只有当响应生成已经开始打印时,任务取消才会起作用。如果任务仍在处理并准备打印,则取消不起作用,并且无论如何都会打印响应。更具体地说,即使单击按钮后,此函数......
  • 如何使用 LSTM 改进法语文本生成模型?
    我正在用Python开发生成式人工智能,使用LSTM模型来处理与法语法律文本相关的查询。我面临输出问题,因为它们要么没有用法语正确处理,要么不准确。我尝试添加更多LSTM层,仅保留最小化作为预处理,但我生成的输出缺乏质量和准确性,您可以在下面的屏幕截图。对于改进我的文本......
  • OpenCV 遍历Mat,像素操作,使用TrackBar 调整图像的亮度和对比度 C++实现
    文章目录1.使用C++遍历Mat,完成颜色反转1.1常规遍历方式1.2迭代器遍历方式1.3指针访问方式遍历(最快)1.4不同遍历方式的时间对比2.图像像素操作,提高图像的亮度3.TrackBar进度条操作3.1使用TrackBar调整图像的亮度3.2使用TrackBar调整图像的对比度1.使用C++遍历M......
  • 【PyTorch】图像多分类项目
    【PyTorch】图像二分类项目【PyTorch】图像二分类项目-部署【PyTorch】图像多分类项目【PyTorch】图像多分类项目部署多类图像分类的目标是为一组固定类别中的图像分配标签。目录加载和处理数据搭建模型定义损失函数定义优化器训练和迁移学习用随机权重进行训......
  • 基于声学基元的高质量空间音频生成框架
    关键词:人体姿态、声学基元、空间音频建模、体积渲染    过去几年中,渲染和动画制作逼真的3D人体模型技术已经发展成熟,并且达到了令人印象深刻的质量水平。然而,与这些全身模型相关联的空间音频建模,却在很大程度上被忽视了。换句话说,尽管我们已经能够创建视觉上令人信服......
  • 用Python生成图形
    在Python中生成图形可以使用多种库,具体取决于你想要生成的图形类型。以下是一些常见的库和它们通常用于创建的图形类型:Matplotlib -最常用的绘图库,适合创建各种静态、动态以及交互式的可视化图表。Seaborn -基于Matplotlib,提供更高级的数据可视化功能,特别适用于统计图形。......
  • 免费【2024】springboot宝鸡文理学院学生成绩动态追踪系统
     博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大......
  • 免费【2024】springboot宝鸡文理学院学生成绩动态追踪系统
     博主介绍:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌技术范围:SpringBoot、Vue、SSM、HTML、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大......