首页 > 其他分享 >0194-显示球体法向量

0194-显示球体法向量

时间:2024-07-17 14:55:27浏览次数:11  
标签:1.0 let 0194 球体 new 向量 ray

环境

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

前言

说明

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

目标

在上一节,如果和球体相交,则直接显示红色。
这一节,将根据相交时的法向量来显示颜色。

返回方程的解

// 根据推导,转化成了一元二次方程的形式,变为判断方程是否有解
fn hit_sphere(center: Point3, radius: f64, ray: &Ray) -> Option<f64> {
    // 球心到射线起点的向量,
    let oc = ray.origin() - center;

    let a = ray.direction().dot(ray.direction());
    let b = 2.0 * oc.dot(ray.direction());
    let c = oc.dot(oc) - radius * radius;
    // b 平方减 4ac 来判断一元二次方程是否有解
    let discriminant = b * b - 4.0 * a * c;

    match discriminant < 0.0 {
        false => Some((-b - discriminant.sqrt()) / (2.0 * a)),
        true => None,
    }
}

显示法向量

// 光线的颜色计算
fn ray_color(ray: &Ray) -> Color {
    let t = hit_sphere(Point3::new(0.0, 0.0, -1.0), 0.5, ray);
    if let Some(root) = t {
        // 是否命中了球体,求得法向量
        let n = (ray.at(root) - Vector3::new(0.0, 0.0, -1.0)).unit();
        // 将法向量在RGB三种颜色上进行可视化,不考虑背面
        return 0.5 * Color::new(n.x + 1.0, n.y + 1.0, n.z + 1.0);
    }

    // 射线的单位向量
    let unit = ray.direction().unit();
    // 因为需要得到上下渐变的背景图,所以需要对 y 进行插值。
    // 因为不考虑反方向,所以将其加 1 乘 0.5
    let t = 0.5 * (unit.y + 1.0);
    // 线性插值,根据不同的光线得到在下面这个范围里的不同的颜色,并且是渐变色。
    (1.0 - t) * Color::new(1.0, 1.0, 1.0) + t * Color::new(0.5, 0.7, 1.0)
}

效果

显示法向量

总结

根据光线和球体的相交的点,求得该点在球体上的法向量,并且进行了可视化。

附录

标签:1.0,let,0194,球体,new,向量,ray
From: https://www.cnblogs.com/jiangbo4444/p/18307353

相关文章

  • 0191-向量的四则运算
    环境Time2022-11-15WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标定义三维向量的几个基本运算函数。加法两个向量相加,结果为对应方向上的数相加。//向量的加法implAddforVector3{typeOu......
  • 如何将文本转换为向量?(方法四)
    ​ 文本转换为向量有多种方式:方法一:通过模型服务灵积DashScope将文本转换为向量(推荐)方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量方法三:通过JinaEmbeddingsv2模型将文本转换为向量方法四:通过百川智能向量化模型将文本转换为向量本文介绍方法四:如......
  • 如何将文本转换为向量?(方法三)
    ​ 文本转换为向量有多种方式:方法一:通过模型服务灵积DashScope将文本转换为向量(推荐)方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量方法三:通过JinaEmbeddingsv2模型将文本转换为向量方法四:通过百川智能向量化模型将文本转换为向量本文介绍方法三:如......
  • 三大知名向量化模型比较分析——m3e,bge,bce
    先聊聊出处。M3E是MokaMassiveMixedEmbedding的缩写,Moka,此模型由MokaAI训练,开源和评测,训练脚本使用uniem,评测BenchMark使用MTEB-zhMassive,此模型通过千万级(2200w+)的中文句对数据集进行训练Mixed,此模型支持中英双语的同质文本相似度计算,异质文本检索等功......
  • 如何将文本转换为向量?(方法二)
    ​ 文本转换为向量有多种方式:方法一:通过模型服务灵积DashScope将文本转换为向量(推荐)方法二:通过ModelScope魔搭社区中的文本向量开源模型将文本转换为向量方法三:通过JinaEmbeddingsv2模型将文本转换为向量方法四:通过百川智能向量化模型将文本转换为向量 本文介绍方法二......
  • 0190-定义三维向量
    环境Time2022-11-14WSL-Ubuntu22.04Rust1.65.0前言说明参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html目标将之前定义的三种颜色,封装到一个三维的向量中,保持原有的逻辑不变。main.rsusecrate::vector3::Color;modvector3;fnmain(){......
  • 数据库-SQL_duckdb向量化计算-vector
    duckdbDuckDB0.10.0引入了新的数据类型ArrayArray不同于Postgres的数组类型(Postgres的是可变长度的),DuckDB的Array列存储固定大小的数组目前相似度计算支持单精度浮点数(4字节)DuckDB的FLOAT4=numpy.float3目前vss功能还有待丰富--持续关注Vector向......
  • Turtlebot3在ROS Gazebo中使用OpenCV检测并跟踪球体
    原文链接:https://www.youtube.com/watch?v=Rw6ATkORRG8   一个小巧的机器人在虚拟世界中敏捷地追踪着一个滚动的球体。Turtlebot3,一个搭载ROS操作系统的智能机器人,在Gazebo仿真环境中,利用OpenCV的神奇力量,展现出令人惊叹的视觉追踪能力。 Turtlebot3的"眼睛"是一台高清......
  • 乘积量化pq:将高维向量压缩 97%
    向量相似性搜索在处理大规模数据集时,往往面临着内存消耗的挑战。例如,即使是一个包含100万个密集向量的小数据集,其索引也可能需要数GB的内存。随着数据集规模的增长,尤其是高维数据,内存使用量会迅速增加,这可能导致内存管理问题。乘积量化(PQ)是一种流行的方法,能够显著压缩高维......
  • [namespace hdk] 向量 direct_vector
    我忏悔我有罪我心情又不好了不知道干什么所以又不小心封了个东西啊啊啊啊啊啊啊啊功能已重载[]运算符(右值)谁能教教我怎么把[]变成stl类似的左值表达式(直接返回地址需要在前面加*,挺麻烦的)已重载=运算符(可使用向量或std:::vector)已重载++=--=-(负号)*(点乘)*=(......