书上的原话是:visualize the normals with a color map,但是代码实现的是光线撞上球,然后色彩表(RGB)可视化“撞点”的法向量。

开章第一句是“First, let’s get ourselves a surface normal so we can shade.”。这句话是看懂了“获取法向量是为了shade”,但是不知道具体是讲的是啥。为什么要可视化?为什么要用色彩表来可视化?shade时怎么用这个?不懂,但是还觉得很厉害的样子。

什么是法向量?什么是球的法向量?不解释,找初中数学老师。

在此讨论的法向量是单位法向量。

书上先介绍了球的法向量,然后直接承接

“Let’s that into the code now, and shade it”(太直接了啊,有木有??)

“We don’t have any lights or anything yet, so let’s just visualizethe normals with a color map.”(此处更加直接,直接跳到用色彩表可视化法向量。木有原因,木有理由,木有前戏,臣妾接受不了啊)

“A common trick used for visualizing normals is to map each componentto the interval from 0 to 1, and then map x/y/z to r/g/b”

(这句话的意思是:怎么用色彩表可视化(单位)法向量?将单位法向量的坐标x/y/z映射成r/g/b。具体做法:考虑x/y/z在[-1,1],r/g/b在[0,1],怎么映射?x/y/z分别+1然后/2)

看代码:(红色字体部分是有改动的)

float hit_sphere(const vec3&center, float radius, const ray& r){

//特别注意此处表示,hit_sphere()函数的返回值类型有bool变成float。此处容易被忽略。本屌之前就没有改过来,导致输出结果中出现一个像素的值溢出,从而XnView无法显示该结果。但是……但是……重点来了,将溢出的像素点的值(-2147483648 -2147483648 -2147483648)改成它上一个像素点的值(0 127127),得到一张“神奇图片”,后面再贴出来。

vec3 oc = r.orgin() -center;

float a =oc.dot(r.direction(), r.direction());

float b = 2.0 *oc.dot(oc, r.direction());

float c = oc.dot(oc,oc) - radius*radius;

float discriminant = b*b - 4*a*c;

if(discriminant < 0){

return -1.0;

}

//判别式<0,没有实根,返回-1。此处为什么返回-1,而不是0呢?首先,这个函数返回的函数的根,若返回0,即根是0,也就是光线的原点,所以有实际的物理意义,容易产生误会;另外,返回-1,有的同志会说,-1也是实根啊,不会产生误解么?不会,因为t<0对于光线来说是没有意义的(即在光线起点的后面,这个是什么鬼?无实际意义)

else{

return (-b -sqrt(discriminant)) / (2.0*a);

}

//“-”表示返回的是较小的那个实根,也就是离光线起点较近的那个交点

}

vec3 color(const ray&r){

float t = hit_sphere(vec3(0,0,-1), 0.5, r);

if(t > 0.0){

vec3 N = unit_vector(r.point_at_parameter(t) - vec3(0,0,-1));

return 0.5*vec3(N.x()+1, N.y()+1, N.z()+1);

}

//t>0,表示有具有实际意义的根。r.point_at_parameter(t)通过t的值获得交点P的坐标,P的坐标减去球心的坐标即得到法向量,然后标准化后得到单位法向量,然后将单位法向量映射成色彩表。后面在main函数中对应设置具体的RGB值实现法向量的可视化。

vec3 unit_direction =unit_vector(r.direction());

t =0.5*(unit_direction.y() + 1.0);

return(1.0-t)*vec3(1.0, 1.0, 1.0) + t*vec3(0.5, 0.7, 1.0);//white, light blue

//        return(1.0-t)*vec3(1.0, 1.0, 1.0) + t*vec3(1.0, 0, 0.7);//white, pink

}

先贴出正常的结果图:

然后贴出前面提到的“神奇图片”:

(是不是感觉很神奇的样子?一方面,本屌认为这张图确实很好看;另一方面,图的中心点原本的值是溢出的,是将溢出像素点的值手动替换成上一个像素点的值之后,才得到这张图片的。所以,这是一张意外的错误的神奇的图。不知道是独一无二的图?学习这个小册子的应该是小众,一方面这个小册子没有纸质版,另一方面kindle版不在中国内地销售;在这小众中忘记将bool改成float的应该是小小众;小小众中在图片无法显示时发现是像素值溢出点(大概在第一万个像素点)的问题的应该是小小小众;选择将像素点的溢出值替换成上一个像素点的值的应该是小小小小众。所以,这张图有可能是独一无二的,因为它源自一个错误。)

问题十四:怎么可视化球的法向量相关推荐

  1. 视觉SLAM十四讲学习笔记-第三讲-相似、仿射、射影变换和eigen程序、可视化演示

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  2. 一门课程学习转录组调控分析和R可视化第十四期 (线上线下开课)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...

  3. 高级转录组调控分析和R语言数据可视化第十四期 (线上线下开课)

    福利公告:为了响应学员的学习需求,经过易生信培训团队的讨论筹备,现决定安排扩增子16S分析.宏基因组.Python课程.转录组线上直播课.报名参加线上直播课的老师可在365天内选择参加同课程的一次线下 ...

  4. Cesium教程(十四):简易三维模型的可视化

    Cesium教程(十四):简易三维模型的可视化 效果预览 1.高效三维数据格式:3D Tiles 3D Tiles是Cesium提出的处理三维地理大数据的数据格式,目前已是OGC数据标准之一,并在We ...

  5. 可视化工具D3.js教程 入门 (第十四章)—— 中国地图

    可视化工具D3.js教程 入门 (第十四章)-- 中国地图 代码 <!DOCTYPE html> <html lang="en"><head>& ...

  6. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  7. 只需十四步:从零开始掌握 Python 机器学习(附资源)

    分享一篇来自机器之心的文章.关于机器学习的起步,讲的还是很清楚的.原文链接在:只需十四步:从零开始掌握Python机器学习(附资源) Python 可以说是现在最流行的机器学习语言,而且你也能在网上找 ...

  8. 第十四章 降维操作-机器学习老师板书-斯坦福吴恩达教授

    第十四章 降维 14.1 目标一:数据压缩 14.2 目标二:可视化 14.3 主成分分析 14.4 主成分分析算法 14.5 选择主成分数量 14.6 压缩重建 14.7 使用PCA的建议 14.1 ...

  9. ROS探索总结(十三)(十四)(十五)——导航与定位框架 move_base(路径规划) amcl(导航与定位)

    ROS探索总结(十三)--导航与定位框架 导航与定位是机器人研究中的重要部分.         一般机器人在陌生的环境下需要使用激光传感器(或者深度传感器转换成激光数据),先进行地图建模,然后在根据建 ...

最新文章

  1. 随机森林采用多数表决的一种,最终表决结果不是树上的类别(class)频率,而是树上的各类别概率的平均值
  2. 【400】numpy.pad 为数组加垫(迷宫类题目)
  3. 20165302第八周总结
  4. 合理规划您的硬盘分区
  5. 微软Kinect 1.7 附带ColorBasics-D2D示例程序基本解析
  6. Transformer总结(2022版)
  7. windows 全局变量_如何在Windows中使用全局系统环境变量
  8. h5评论直接显示代码_全套H5教程免费学,让你0基础自学制作H5页面
  9. 网络编辑的内容制作及管理规范
  10. NSString copy or not (strong)?
  11. Oracle数据库基础入门视频合集
  12. AI+一统互联网和物联网
  13. 基于stacking集成学习的金线莲质量鉴别方法研究:人工智能与医疗的结合与发展
  14. 阿里的活动宣传做得好 一百分!
  15. C语言内存空间分布详解
  16. 在蓝图中设置人物动作 教程
  17. Server_虚拟机闲谈;
  18. 云和恩墨23届校园招聘,内推NTANNzK
  19. vivo7.0系统手机最完美激活Xposed框架的教程
  20. 中国法定节假日天数以及世界各国放假天数

热门文章

  1. 用迭代法求某数a的平方根
  2. 【CSS】:中文颜色名称对照
  3. 学习英语的方法(转载)
  4. 字符串,字符数组的初始化
  5. 高端大气的艺术海报的ps教程
  6. Linux攻关之基础模块九 系统基本权限
  7. sftp常用命令介绍
  8. Postman--使用
  9. iview表格内容居中
  10. 二进制安装Kubernetes(k8s) v1.24.0 IPv4