36.3 圆盘Inverse Mapping

36.3.1 数学推导

我们只考虑圆盘垂直于ZOX平面的情况。

36.3.2 看C++代码实现

----------------------------------------------elliptic_plane.cpp ------------------------------------------

elliptic_plane.cpp

#include "elliptic_plane.h"#include <iostream>
using namespace std;bool elliptic_plane::hit(const ray& r, float t_min, float t_max, hit_record& rec) const {
#if ELLIPTIC_PLANE_LOG == 1std::cout << "-------------elliptic_plane::hit----------------" << endl;
#endif // ELLIPTIC_PLANE_LOGif(dot(normal, r.direction()) == 0) {return false;}else {if (dot(normal, r.direction()) > 0) {rec.normal = - normal;}float temp = (dot(normal, center) - dot(normal, r.origin())) / dot(normal, r.direction());if (temp < t_max && temp > t_min) {rec.t = temp;rec.p = r.point_at_parameter(rec.t);if (((((rec.p.x()-center.x())*(rec.p.x()-center.x())) / (intercept_x*intercept_x))+ (((rec.p.y()-center.y())*(rec.p.y()-center.y())) / (intercept_y*intercept_y))+ (((rec.p.z()-center.z())*(rec.p.z()-center.z())) / (intercept_z*intercept_z))) <= 1) {rec.mat_ptr = ma;
                    if ((intercept_x == intercept_y) && (intercept_y == intercept_z)) {rec.v = sqrt(((rec.p.x()-center.x())*(rec.p.x()-center.x()) + (rec.p.y()-center.y())*(rec.p.y()-center.y())) / (intercept_x*intercept_x));vec3 pc1 = vec3(rec.p.x()-center.x(), rec.p.y()-center.y(), 0);vec3 vx = vec3(1, 0, 0);float u = acos(dot(pc1, vx) / (pc1.length()*vx.length())) / (2*M_PI);
/*                        float u = acos((rec.p.x()-center.x()) /
sqrt((rec.p.x()-center.x())*(rec.p.x()-center.x())
+ (rec.p.y()-center.y())*(rec.p.y()-center.y()))) / (2*M_PI);
*/
                        if ((rec.p.y()-center.y()) < 0) {rec.u = 1 - u;}else {rec.u = u;}}else {rec.u = -1.0;rec.v = -1.0;}
                    return true;}}return false;}
}

----------------------------------------------main.cpp ------------------------------------------

main.cpp

        hitable *list[2];list[0] = new sphere(vec3(0.0,-100,0), 100, new lambertian(vec3(0.8, 0.8, 0.0)));list[1] = new elliptic_plane(vec3(0.0, 2.5, 0), vec3(0, 0, 1), 2.5, 2.5, 2.5, new lambertian(vec3(0.8, 0.8, 0.0)));hitable *world = new hitable_list(list,2);vec3 lookfrom(0, 2.5, 20);vec3 lookat(0, 2.5, 0);float dist_to_focus = (lookfrom - lookat).length();float aperture = 0.0;camera cam(lookfrom, lookat, vec3(0,1,0), 20, float(nx)/float(ny), aperture, 0.7*dist_to_focus);

输出图片:

uv原图:

问题三十六:ray tracing中的Inverse Mapping(3)——圆盘Inverse Mapping相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 三十六、Java集合中的HashMap

    @Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  7. Python编程基础:第三十六节 模块Modules

    第三十六节 模块Modules 前言 实践 前言 我们目前所有的代码都写在一个文档里面.如果你的项目比较大,那么把所有功能写在一个文件里就非常不便于后期维护.为了提高我们代码的可读性,降低后期维护的成 ...

  8. OpenCV学习笔记(三十六)——Kalman滤波做运动目标跟踪 OpenCV学习笔记(三十七)——实用函数、系统函数、宏core OpenCV学习笔记(三十八)——显示当前FPS OpenC

    OpenCV学习笔记(三十六)--Kalman滤波做运动目标跟踪 kalman滤波大家都很熟悉,其基本思想就是先不考虑输入信号和观测噪声的影响,得到状态变量和输出信号的估计值,再用输出信号的估计误差加 ...

  9. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  10. 三十六、rsync通过服务同步、Linux系统日志、screen工具

    三十六.rsync通过服务同步.Linux系统日志.screen工具 一.rsync通过服务同步 该方式可以理解为:在远程主机上建立一个rsync的服务器,在服务器上配置好各种应用,然后本机将作为客户 ...

最新文章

  1. 微信小程序-京东购物系列一
  2. pixhawk原生固件笔记
  3. iOS中的WiFi与硬件通信
  4. oracle session_wait,转载:学习Oracle动态性能表-(8)-V$SESSION_WAIT,V$SESSION_EVENT
  5. springboot 之Spring Web Mvc Framework
  6. 是自学前端还是培训学前端?
  7. 如何查看泛泰A870高通骁龙600(APQ8064T)的CPU体质(A850/A860也可参考)
  8. squid代理服务器的应用
  9. webmagic保存html页面,WebMagic抓取前端Ajax渲染的页面
  10. 来自清华学子的一个自述---在树洞里
  11. h5页面如何切图_H5设计稿切图按照什么尺寸,微信公众号版本的
  12. 恒源智GPU云服务器
  13. 直播 | 2017阿里双11在线技术峰会
  14. javac java编译-g
  15. 仿站高手是怎么练成的 分析仿站必备知识总结
  16. graphpad做图如何加星号_graphpad prism 8.0 - 不用 PS,两招教你做出能发高分 SCI 的组合图!...
  17. 关于 java.util.LinkedHashMap cannot be cast to xxx错误的解决方案
  18. 在word2016中使用宏(VBA)来自动设置表格行高
  19. vue 海康视频播放
  20. html 移动端缩小显示图片,Vue移动端可放大缩小图片vue-photo-preview

热门文章

  1. pacemaker+mysql+drbd
  2. Maven系列(一):Maven简介
  3. WCF 实例 —— Android 短信助手 (WCF + Android)
  4. pl/sql 设置编码
  5. 【廖雪峰官方网站/Java教程】Maven基础
  6. 【CV】如何使用Tensorflow提供的Object Detection API --2--数据转换为TFRecord格式
  7. Java面试题系列(X)锁的原理
  8. kubernetes源码阅读笔记——Kubelet(之三)
  9. continue跳转
  10. 数组、字典转json串,不支持字符串