当两个曲面在空间相交时,怎么连接相交处?

比如,两个相互垂直的柱面在空间相交如下:

怎么将黑色圈内的相交处画得平滑些?也就是将相交处包起来,添加一个类似水管的四通接口。

45.1 数学推导

45.2 看C++代码实现

----------------------------------------------quartic_blend_cylinder.h ------------------------------------------

quartic_blend_cylinder.h

#ifndef QUARTIC_BLEND_CYLINDER_H
#define QUARTIC_BLEND_CYLINDER_H#include <hitable.h>
#include "material.h"
#include "log.h"class quartic_blend_cylinder : public hitable
{public:quartic_blend_cylinder() {}quartic_blend_cylinder(vec3 cen1, float a1, float b1, float lh1, vec3 cen2, float a2, float b2, float lh2, float a3, float b3, material *m) {center1 = cen1;intercept_x1 = a1;intercept_z1 = b1;length_half_y1 = lh1;//这个参数无实际用途,只是为了切割看其内部结构center2 = cen2;intercept_y2 = a2;intercept_z2 = b2;length_half_x2 = lh2; //这个参数无实际用途,只是为了切割看其内部结构intercept_s1 = a3;intercept_s2 = b3;ma = m;}virtual bool hit(const ray& r, float tmin, float tmax, hit_record& rec) const;vec3 center1;float intercept_x1, intercept_z1, length_half_y1;vec3 center2;float intercept_y2, intercept_z2, length_half_x2, intercept_s1, intercept_s2;material *ma;
};#endif // QUARTIC_BLEND_CYLINDER_H

----------------------------------------------quartic_blend_cylinder.cpp ------------------------------------------

quartic_blend_cylinder.cpp

#include "quartic_blend_cylinder.h"#include <iostream>
using namespace std;bool quartic_blend_cylinder::hit(const ray& r, float t_min, float t_max, hit_record& rec) const {
#if QUARTIC_BLEND_CYLINDER_LOG == 1std::cout << "-------------quartic_blend_cylinder::hit----------------" << endl;
#endif // QUARTIC_BLEND_CYLINDER_LOGfloat a1_square = intercept_x1*intercept_x1;float b1_square = intercept_z1*intercept_z1;float a1b1_square_a3 = a1_square*b1_square+intercept_s1;float a2_square = intercept_y2*intercept_y2;float b2_square = intercept_z2*intercept_z2;float a2b2_square_b3 = a2_square*b2_square+intercept_s2;float a3_square = intercept_s1*intercept_s1;float b3_square = intercept_s2*intercept_s2;float a3b3_sqare = a3_square*b3_square;float xd = r.direction().x();float yd = r.direction().y();float zd = r.direction().z();float xoc1 = r.origin().x() - center1.x();float zoc1 = r.origin().z() - center1.z();float yoc2 = r.origin().y() - center2.y();float zoc2 = r.origin().z() - center2.z();float A1 = b1_square*xd*xd + a1_square*zd*zd;float B1 = 2*b1_square*xd*xoc1 + 2*a1_square*zd*zoc1;float C1 = b1_square*xoc1*xoc1 + a1_square*zoc1*zoc1;float A2 = A1*A1*b3_square;float B2 = 2*A1*B1*b3_square;float C2 = (B1*B1 + 2*A1*C1 - 2*a1b1_square_a3*A1)*b3_square;float D2 = (2*B1*C1 - 2*a1b1_square_a3*B1)*b3_square;float E2 = (C1*C1 - 2*a1b1_square_a3*C1 + a1b1_square_a3*a1b1_square_a3)*b3_square;float A3 = b2_square*yd*yd + a2_square*zd*zd;float B3 = 2*b2_square*yd*yoc2 + 2*a2_square*zd*zoc2;float C3 = b2_square*yoc2*yoc2 + a2_square*zoc2*zoc2;float A4 = A3*A3*a3_square;float B4 = 2*A3*B3*a3_square;float C4 = (B3*B3 + 2*A3*C3 - 2*a2b2_square_b3*A3)*a3_square;float D4 = (2*B3*C3 - 2*a2b2_square_b3*B3)*a3_square;float E4 = (C3*C3 - 2*a2b2_square_b3*C3 + a2b2_square_b3*a2b2_square_b3)*a3_square - a3b3_sqare;float roots[5];roots_quartic_equation2(A2+A4, B2+B4, C2+C4, D2+D4, E2+E4, roots);float temp;if (roots[0] > 0.0001) {for (int i=1; i<int(roots[0]); i++) {for (int j=i+1; j<int(roots[0])+1; j++) {if (roots[i] > roots[j]) {temp = roots[i];roots[i] = roots[j];roots[j] = temp;}}}//对所有实根从小到大排序for (int k=1; k<int(roots[0])+1; k++) {if (roots[k] < t_max && roots[k] > t_min) {rec.t = roots[k];rec.p = r.point_at_parameter(rec.t);vec3 pc1 = rec.p - center1;vec3 pc2 = rec.p - center2;if (((pc1.y()>= -length_half_y1) && (pc1.y() <= length_half_y1)) && ((pc2.x() >= -length_half_x2) && (pc2.x() <= length_half_x2))) {float nx = 2*b3_square*(b1_square*pc1.x()*pc1.x() + a1_square*pc1.z()*pc1.z() - a1b1_square_a3)*2*b1_square*pc1.x();float ny = 2*a3_square*(b2_square*pc2.y()*pc2.y() + a2_square*pc2.z()*pc2.z() - a2b2_square_b3)*2*b2_square*pc2.y();float nz = 2*b3_square*(b1_square*pc1.x()*pc1.x() + a1_square*pc1.z()*pc1.z() - a1b1_square_a3)*2*a1_square*pc1.z()+ 2*a3_square*(b2_square*pc2.y()*pc2.y() + a2_square*pc2.z()*pc2.z() - a2b2_square_b3)*2*a2_square*pc2.z();rec.normal = unit_vector(vec3(nx, ny, nz));if(dot(r.direction(), rec.normal) > 0) {rec.normal = - rec.normal;}rec.mat_ptr = ma;rec.u = -1.0;rec.v = -1.0;return true;}}}}return false;
}

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

main.cpp

        hitable *list[3];list[0] = new quadratic_cylinder_all(vec3(0, 3, 0), 1, 1, 1.00001, 3,new lambertian(vec3(0.0, 1.0, 0.0)), vec3(0, 1, 0), 0);list[1] = new quadratic_cylinder_all(vec3(0, 3, 0), 1, 1, 1.00001, 3,new lambertian(vec3(0.0, 1.0, 0.0)), vec3(1, 0, 0), 0);list[2] = new quartic_blend_cylinder(vec3(0, 3, 0), 1, 1, 3, vec3(0, 3, 0), 1, 1, 3, 0.5, 0.5, new lambertian(vec3(0.0, 1.0, 0.0)));hitable *world = new hitable_list(list,3);vec3 lookfrom(-1.5, 4, 5);vec3 lookat(0, 3, 0);float dist_to_focus = (lookfrom - lookat).length();float aperture = 0.0;camera cam(lookfrom, lookat, vec3(0,1,0), 80, float(nx)/float(ny), aperture, 0.7*dist_to_focus);

输出图片如下:

换个角度看看:

vec3 lookfrom(0.0001, 8, 0);

vec3 lookat(0, 3, 0);

vec3 lookfrom(5, 3, 0);

vec3 lookat(0, 3, 0);

45.3 blending surface的结构图

vec3 lookfrom(0, 3, 5);

vec3 lookat(0, 3, 0);

vec3 lookfrom(0.0001, 8, 0);

vec3 lookat(0, 3, 0);

vec3 lookfrom(5, 3, 0);

vec3 lookat(0, 3, 0);

vec3 lookfrom(0, 6, 3);

vec3 lookat(0, 3, 0);

vec3 lookfrom(3, 6, 3);

vec3 lookat(0, 3, 0);

问题四十五:怎么画ray tracing图形中的blending and joining surface相关推荐

  1. 问题二十一:怎么模拟ray tracing图形中不同材料的颜色(diffuse and metal)

    在漫射材料章节,我们将多个球都模拟成漫射材料的颜色.那么问题来了,我们能不能将不同的球模拟成不同材料的颜色呢?可以哈!我们这一章节就干这事. 21.1总结一下设置颜色的几种方法 我们还是先回忆一下:r ...

  2. 问题二十四:怎么模拟ray tracing图形中介质材料的颜色(dielectric)

    这里的"介质"是指光可以通过的物质.比如,水,玻璃等.也就是我们常说的具有一定透明度的物质. 24.1 预备知识 24.1.1 反射和折射光线的方向向量 反射光线的方向向量: 漫反 ...

  3. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

    孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自学 ...

  4. 【Visual C++】游戏开发笔记四十五 浅墨DirectX教程十三 深度测试和Z缓存专场

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8607864 作者:毛星云(浅墨 ...

  5. Python编程基础:第四十五节 方法链Method Chaining

    第四十五节 方法链Method Chaining 前言 实践 前言 方法链是指一个对象一次调用其自身的多个方法,通常写作对象.方法1.方法2.由于这种调用方法看起来像一个链条,所以我们将其称作方法链. ...

  6. 四十五、深入Java的网络编程(上篇)

    @Author:Runsen @Date:2020/6/8 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

  7. [系统安全] 四十五.APT系列(10)Metasploit后渗透技术信息收集、权限提权和功能模块详解

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  8. NeHe OpenGL教程 第四十五课:顶点缓存

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

  9. JavaScript学习(四十五)—练习题

    JavaScript学习(四十五)-练习题 习题1 习题2:

最新文章

  1. 该段代码编译运行后显示的是蓝色背景,白色闪烁字的效果
  2. 高效大数据开发之 bitmap 思想的应用
  3. 后端技术:mybatis中resultMap用法示例笔记
  4. java 数组存入数据库_Java中关于二维数组的理解与使用
  5. 数组中的forEach和map的区别
  6. 找不到visual studio模板信息 解决方法
  7. Linux 虚拟机配置-network is unreachable
  8. pythonwin是什么_winpython是什么
  9. 磁盘阵列 (RAID)简介
  10. Eclipse 使用
  11. 是否可以在SQLite数据库中一次插入多行?
  12. java删不了_java – 为什么我不能删除项目?
  13. js里获取表单输入值进行比对的方法
  14. Mysql将多个查询结果并列显示
  15. 软件开发团队的脓包(1-3)皇帝的新装、口号党、废话迷
  16. 慕课版软件质量保证与测试(第四章.课后作业)
  17. 破解版xmind 8
  18. BUUCTF刷题记录
  19. DSP TMS320F280049C之捕获eCAP(1)
  20. dom4j解析xml格式字符串获取标签属性和内容

热门文章

  1. 《iPad开发从入门到精通》——6.2节系统主界面
  2. 【JSP笔记】第四章 JSP内置对象【下】
  3. 腾讯QQ认证空间4月27日已全面开放申请,欲进军自媒体
  4. webpack资源的输入与输出
  5. Leetcode 99. 恢复搜索二叉树
  6. 【React】添加新组件
  7. 2.Rails程序框架
  8. codeblocks设置背景主题
  9. 【100Days of 100 line Code】2 day
  10. UT源码105032014052