36.4 圆柱面Inverse Mapping

36.4.1 数学推导

36.4.2 看C++代码实现

----------------------------------------------quadratic.cpp ------------------------------------------

quadratic.cpp

#include "quadratic.h"#include <iostream>
using namespace std;bool quadratic::hit(const ray& r, float t_min, float t_max, hit_record& rec) const {
#if QUADRATIC_LOG == 1std::cout << "-------------quadratic::hit----------------" << endl;
#endif // QUADRATIC_LOGfloat ab_square = intercept_x*intercept_x*intercept_y*intercept_y;float bc_square = intercept_y*intercept_y*intercept_z*intercept_z;float ac_square = sign1*intercept_x*intercept_x*intercept_z*intercept_z;float abc_square = sign2*intercept_x*intercept_x*intercept_y*intercept_y*intercept_z*intercept_z;vec3 inter_square = vec3(bc_square, ac_square, ab_square);vec3 rd_square = vec3(r.direction().x()*r.direction().x(),r.direction().y()*r.direction().y(),r.direction().z()*r.direction().z());float A = dot(inter_square, rd_square);vec3 r0_c = r.origin() - center;vec3 r0_c_rd = vec3(r0_c.x()*r.direction().x(),r0_c.y()*r.direction().y(),r0_c.z()*r.direction().z());float B = 2*dot(r0_c_rd, inter_square);vec3 r0_c_square = vec3(r0_c.x()*r0_c.x(),r0_c.y()*r0_c.y(),r0_c.z()*r0_c.z());float C = dot(r0_c_square, inter_square) - abc_square;float temp, temp1, temp2;vec3 pc;if(A == 0) {if (B == 0) {return false;}else {temp = -C/B;if (temp < t_max && temp > t_min) {rec.t = temp;rec.p = r.point_at_parameter(rec.t);if (((rec.p.y()-center.y()) > -height_half_y) && ((rec.p.y()-center.y()) < height_half_y)) {pc = rec.p - center;rec.normal = unit_vector(vec3(2*bc_square*pc.x(), 2*ac_square*pc.y(), 2*ab_square*pc.z()));if (dot(rec.normal, r.direction()) > 0) {rec.normal = -rec.normal;}rec.mat_ptr = ma;
                        if ((sign1 == 0) && (sign2 == 1) && (intercept_x == intercept_y) && (intercept_y == intercept_z)) {//cylinderrec.v = (rec.p.y() - (center.y() - height_half_y)) / (2*height_half_y);vec3 pc1 = vec3(rec.p.x()-center.x(), 0, rec.p.z()-center.z());vec3 vx = vec3(0, 0, 1);float u = acos(dot(pc1, vx) / (pc1.length()*vx.length())) / (2*M_PI);
//                            float u = acos((rec.p.x() - center.x()) / intercept_x) / (2*M_PI);if ((rec.p.x() - center.x()) < 0) {rec.u = 1-u;}else {rec.u = u;}return true;}
                        else {rec.u = -1.0;rec.v = -1.0;return true;}}else {return false;}}}}else {float discriminant = B*B - 4*A*C;if (discriminant >= 0) {temp1 = (-B - sqrt(discriminant)) / (2.0*A);temp2 = (-B + sqrt(discriminant)) / (2.0*A);if (temp1 > temp2) {//make sure that temp1 is smaller than temp2temp = temp1;temp1 = temp2;temp2 = temp;}if (temp1 < t_max && temp1 > t_min) {rec.t = temp1;rec.p = r.point_at_parameter(rec.t);if (((rec.p.y()-center.y()) > -height_half_y) && ((rec.p.y()-center.y()) < height_half_y)) {pc = rec.p - center;rec.normal = unit_vector(vec3(2*bc_square*pc.x(), 2*ac_square*pc.y(), 2*ab_square*pc.z()));if (dot(rec.normal, r.direction()) > 0) {rec.normal = -rec.normal;}rec.mat_ptr = ma;
                        if ((sign1 == 0) && (sign2 == 1) && (intercept_x == intercept_y) && (intercept_y == intercept_z)) {//cylinderrec.v = (rec.p.y() - (center.y() - height_half_y)) / (2*height_half_y);vec3 pc1 = vec3(rec.p.x()-center.x(), 0, rec.p.z()-center.z());vec3 vx = vec3(0, 0, 1);float u = acos(dot(pc1, vx) / (pc1.length()*vx.length())) / (2*M_PI);
//                            float u = acos((rec.p.x() - center.x()) / intercept_x) / (2*M_PI);if ((rec.p.x() - center.x()) < 0) {rec.u = 1-u;}else {rec.u = u;}return true;}
                        else {rec.u = -1.0;rec.v = -1.0;return true;}}else {
//                        return false;}}if (temp2 < t_max && temp2 > t_min) {rec.t = temp2;rec.p = r.point_at_parameter(rec.t);if (((rec.p.y()-center.y()) > -height_half_y) && ((rec.p.y()-center.y()) < height_half_y)) {pc = rec.p - center;rec.normal = unit_vector(vec3(2*bc_square*pc.x(), 2*ac_square*pc.y(), 2*ab_square*pc.z()));if (dot(rec.normal, r.direction()) > 0) {rec.normal = -rec.normal;}rec.mat_ptr = ma;
                        if ((sign1 == 0) && (sign2 == 1) && (intercept_x == intercept_y) && (intercept_y == intercept_z)) {//cylinderrec.v = (rec.p.y() - (center.y() - height_half_y)) / (2*height_half_y);vec3 pc1 = vec3(rec.p.x()-center.x(), 0, rec.p.z()-center.z());vec3 vx = vec3(0, 0, 1);float u = acos(dot(pc1, vx) / (pc1.length()*vx.length())) / (2*M_PI);
//                            float u = acos((rec.p.x() - center.x()) / intercept_x) / (2*M_PI);if ((rec.p.x() - center.x()) < 0) {rec.u = 1-u;}else {rec.u = u;}return true;}
                        else {rec.u = -1.0;rec.v = -1.0;return true;}}else {
//                        return false;}}}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 quadratic(vec3(0, 2.5, 0), 2.5, 2.5, 2.5, 0, 1, 2.5, new lambertian(vec3(0.8, 0.8, 0.0)));hitable *world = new hitable_list(list,2);vec3 lookfrom(0, 10, 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);

输出图片如下:

vec3 lookfrom(0, 10, 20);

vec3 lookfrom(0, 10, -20);

uv原图:

问题三十六:ray tracing中的Inverse Mapping(4)——圆柱面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管线 ...

最新文章

  1. yum命令安装jdk
  2. DNS解析污染原理——要么修改包,要么直接丢弃你的网络包
  3. 【学术相关】进高校当老师有多难?非海归非 985 怎么办?
  4. 必须掌握的Python技巧(三)
  5. 工作5年后才明白:不起眼的技能中,藏着你的未来
  6. 一张图让你搞懂DES与RSA混合加密技术
  7. C语言:编写一个程序,求s=1+(1+2)+(1+2+3)+....+(1+2+3+....+n)的值。
  8. JS中的各种尺寸问题
  9. this()在java中什么意思?
  10. javascript的apply理解
  11. 计算机蓝牙快捷键,笔记本蓝牙快捷键是什么_怎么打开笔记本电脑蓝牙-win7之家...
  12. 实现百度搜索实时热点爬虫
  13. 企业如何使用OA系统?OA系统有哪些功能和应用的场景?
  14. java io broken pipe解决_报错!!java.io.IOException: 断开的管道 中文报错?Broken pipe?这次发生的报错不影响业务,已有解决方案...
  15. 浅议BGP(一文看懂BGP)
  16. 华中农业大学教务系统自动评教脚本
  17. iOS6和iOS7代码的适配(2)——status bar
  18. SQL删除重复记录保留最大值
  19. redis反序列化报错解决
  20. 基于智能移动设备的IP电话软件的设计与实现

热门文章

  1. Android 逆向分析(三)之动态调试Smali
  2. java基础----集合操作---实例----List集合的初始化
  3. java多线程总结一:线程的两种创建方式及比较
  4. Leetcode - Reverse Words
  5. soft music
  6. 剑指offer——面试题54:表示数值的字符串
  7. 空卡安装设置树莓派4B并安装opencv+QT
  8. python基础:os.path的相关操作
  9. 面向对象的三大特性之多态,封装基础
  10. continue跳转