Inverse Mapping指的是某点在某面的相对位置,这个“相对位置”用u、v表示。 Inverse Mapping完成后,相当于将某面映射到了uv平面,u、v的取值范围为[0, 1]。

这一章节会讲到球面、凸四边形(含三角形)、圆、圆柱面、圆锥面五类面的Inverse Mapping。

为了对比各种面的Inverse Mapping效果,我们用同一个uv平面:

也就是说,以上提到的五类曲面(平面)影射后的uv平面的图都是这一张。那么,问题来了,对于这五类曲面(平面)本身应该分别是什么样子呢(才能最终都映射成这么一样图)?这一章节,就是解决这么个问题。

首先,我们现在在lambertian.cpp中对uv平面这张图描述一下(对应八个色块):

----------------------------------------------lambertian.cpp ------------------------------------------

lambertian.cpp

vec3 get_albedo(float u, float v) {if ((v >= 0) && (v < 0.5)) {if ((u >= 0) && (u < 0.25)) {return vec3(0, 0, 0);//黑色块}else if ((u >= 0.25) && (u < 0.5)) {return vec3(0, 0, 1);//蓝色块}else if ((u >= 0.5) && (u < 0.75)) {return vec3(0, 1, 0); //绿色块}else {return vec3(0, 1, 1); //浅蓝色块}}else if ((v >= 0.5) && (v <= 1.0)) {if ((u >= 0) && (u < 0.25)) {return vec3(1, 0, 0);//红色块}else if ((u >= 0.25) && (u < 0.5)) {return vec3(1, 0, 1);//紫色块}else if ((u >= 0.5) && (u < 0.75)) {return vec3(1, 1, 0);//黄色块}else if ((u >= 0.75) && (u <= 1.0)) {return vec3(1, 1, 1);//浅紫色块}}
}// lambertian::scatter也配合改动一下
bool lambertian::scatter(const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered) const {
//    std::cout << "-------------lambertian::scatter----------------" << endl;vec3 target = rec.p + rec.normal + random_in_unit_sphere();scattered = ray(rec.p, target-rec.p);
if ((rec.u >= 0.0) && (rec.u <= 1.0) && (rec.v >= 0.0) && (rec.v <= 1.0)) {
//映射后的u、v在[0, 1],在物体的hit()会对u、v进行赋值;如果不做映射,则u、v设置为-1,在这里,attenuation还是返回原来的albedo。
        attenuation = get_albedo(rec.u, rec.v);}else {attenuation = albedo;}
    return true;
}

问题三十六:ray tracing中的Inverse Mapping(0)——概要相关推荐

  1. 问题三十六:ray tracing中的Inverse Mapping(5)——圆锥面Inverse Mapping

    36.5 圆锥面Inverse Mapping 36.5.1 数学推导 36.5.2 看C++代码实现 ----------------------------------------------qu ...

  2. 问题三十六:ray tracing中的Inverse Mapping(4)——圆柱面Inverse Mapping

    36.4 圆柱面Inverse Mapping 36.4.1 数学推导 36.4.2 看C++代码实现 ----------------------------------------------qu ...

  3. 问题三十六:ray tracing中的Inverse Mapping(3)——圆盘Inverse Mapping

    36.3 圆盘Inverse Mapping 36.3.1 数学推导 我们只考虑圆盘垂直于ZOX平面的情况. 36.3.2 看C++代码实现 ----------------------------- ...

  4. 问题三十六:ray tracing中的Inverse Mapping(1)——球面Inverse Mapping

    36.1 球面Inverse Mapping 36.1.1 数学推导 球面(球心在(X0, Y0, Z0),半径为R)上任意一点P的坐标(Xi, Yi, Zi)的参数表示为: Xi = X0 + R* ...

  5. 问题三十一:ray tracing中Convex Quadrilateral Inverse Mapping

    从这一章节开始,主要是学习<An Introduction to Ray Tracing> 光线和多边形相交问题的求解: 1,光线和多边形所在的平面相交,求出交点: 2,判断交点是否在多边 ...

  6. 智能一代云平台(三十六):项目中如何做到避免传递依赖

    [前言] 现在Maven项目风靡全球,不可否认的是Maven在解决项目依赖关系十分的给力:不过传递依赖也会有很多坑:接下来给大家分享一下我们项目中是如何解决传递依赖. [传递依赖中哪些事儿]     ...

  7. PreScan快速入门到精通第三十六讲PreScan中使用车道线传感器

    车道标记传感器提供有关道路上存在的车道线的信息.这些信息以车道线和扫描线相对于传感器的交叉点的形式提供.车道标记传感器的功能和使用可以在车道保持的例子中找到. 车道标记数据  主要是,车道标记传感器提 ...

  8. 三十六、Scrapy 中的复写默认管道和Rule扩展

    @Author:Runsen scrapy中的强大媒体管道(二) 上文用scrapy 爬百度美女图片,补充如何重写默认管道知识点,当年爬取的网站是:http://www.27270.com/.但是这里 ...

  9. php分享(三十六)mysql中关联表更新

    一:关联不同的表更新 1: 通过where关联更新 update student s, city c set s.province_name = c.province_name, s.city_nam ...

最新文章

  1. 生命科学领域颠覆性技术——基因测序
  2. RID枚举工具RidEnum
  3. python 中map()和lamda的简单实用
  4. 让IE的F1帮助变成自己的
  5. Memcached 工作原理
  6. 软件工程---08.软件测试
  7. 【转】CentOs中Apache开启rewrite模块详解
  8. HealthKit教程 Swift版:锻炼信息
  9. 分页解决方案 之 分页算法——Pager_SQL的思路和使用方法
  10. matlab做经济地理、地理距离、经济距离空间权重矩阵
  11. ff删除httpwatch插件
  12. 一、(3) 结巴分词
  13. VS2019安装和使用教程
  14. MySql:基本SQL
  15. 费马小定理 (证明)
  16. verilog 定点数、浮点数是什么?怎么表示?怎么做运算?
  17. python中datetime是什么意思_Python中time和datetime的区别
  18. JAVA数字藏品NFT平台源码(附带部署文档)
  19. 浅谈网络地址转换(NAT)技术与内网、外网
  20. CDMA sid, nid, bid 含义解释

热门文章

  1. 针对关键字是字符串的一个比较好的散列函数
  2. Asp.net 调用sqlserver存储过程参数传中文乱码!
  3. php 按引用传递的使用
  4. 程序员面试金典——5.5整数转化
  5. 【EOS】EOS环境基础
  6. numpy: np.random.get_state()
  7. Scrapy简单入门及实例讲解
  8. C#中英文逗号之间的相互转化
  9. windows下忘记mysql 密码的解决方法
  10. Android 高级面试-2:IPC 相关