接“问题五十四”,已经简单学习了bezier曲线曲面,知道了双三次bezier曲面的矩阵表示形式,同时也以此画出了曲面图形。

这一章节主要以对比bezier曲线曲面和b-spline曲线曲面的方式来简单学习b-spline曲线曲面。

56.1 b-spline曲线

56.2 b-spline曲面

56.3 b-spline的C++代码实现

----------------------------------------------parametric_surface.h ------------------------------------------

parametric_surface.h

#ifndef PARAMETRIC_SURFACE_H
#define PARAMETRIC_SURFACE_H#include <hitable.h>
#include "material.h"
#include "log.h"#define TYPE 3
/*
TYPE=1: sphere;
TYPE=2: horn;
TYPE=3: bezier3;
*/
#define CURVE 1
/*
CURVE=1: bezier
CURVE=2: b-spline
*/class parametric_surface : public hitable
{public:parametric_surface() {}
#if ((TYPE == 1) || (TYPE ==2))parametric_surface(vec3 cen, float a, float b, float c, float hy, material *m, float r, float t, float n) : center(cen), intercept_x(a), intercept_y(b), intercept_z(c), height_half_y(hy), ma(m), rho(r), theta(t), num(n) {}
#endif // TYPE
#if TYPE == 3parametric_surface(material *m, float r, float t, float n, vec3 *cp) : ma(m), rho(r), theta(t), num(n) {
/*相比bicubic Bezier surface,bicubic b-spline surface只需要改动如下黄底部分代码*/vec3 ctrl_points[4][4];for (int i=0; i<16; i++) {ctrl_points[(i/4)][(i%4)] = cp[i];}
#if CURVE == 1//bezierfloat matrix_t[4][4] = {{ 1,  0,  0, 0},{-3,  3,  0, 0},{ 3, -6,  3, 0},{-1,  3, -3, 1}};float matrix[4][4] = {{1, -3,  3, -1},{0,  3, -6,  3},{0,  0,  3, -3},{0,  0,  0,  1}};
#endif // CURVE

#if CURVE == 2//b-spline

float matrix_t_6[4][4] = {{ 1,  4,  1,0},

{-3,  0,  3,0},

{ 3,-6,  3, 0},

{-1,  3, -3, 1}};

float matrix_t[4][4], matrix[4][4];

for (int i=0; i<4; i++) {

for (int j=0; j<4; j++) {

matrix_t[i][j] =matrix_t_6[i][j] / 6.0;

matrix[j][i] = matrix_t[i][j];

}

}

#endif // CURVE

            float points_x[4][4], points_y[4][4], points_z[4][4], points_x_t[4][4], points_y_t[4][4], points_z_t[4][4];get_bezier_matrix_xyz_4_4(ctrl_points, points_x, points_y, points_z);matrix_4_4_multiply_4_4(matrix_t, points_x, points_x_t);matrix_4_4_multiply_4_4(points_x_t, matrix, matrix_c_x);matrix_4_4_multiply_4_4(matrix_t, points_y, points_y_t);matrix_4_4_multiply_4_4(points_y_t, matrix, matrix_c_y);matrix_4_4_multiply_4_4(matrix_t, points_z, points_z_t);matrix_4_4_multiply_4_4(points_z_t, matrix, matrix_c_z);float min_x = points_x[0][0];float max_x = points_x[0][0];float min_y = points_y[0][0];float max_y = points_y[0][0];float min_z = points_z[0][0];float max_z = points_z[0][0];for (int i=0; i<4; i++) {for (int j=0; j<4; j++) {if (min_x > points_x[i][j]) {min_x = points_x[i][j];}if (max_x < points_x[i][j]) {max_x = points_x[i][j];}if (min_y > points_y[i][j]) {min_y = points_y[i][j];}if (max_y < points_y[i][j]) {max_y = points_y[i][j];}if (min_z > points_z[i][j]) {min_z = points_z[i][j];}if (max_z < points_z[i][j]) {max_z = points_z[i][j];}}}bezier3_bl = vec3(min_x, min_y, min_z);bezier3_bh = vec3(max_x, max_y, max_z);}
#endif // TYPEvirtual bool hit(const ray& r, float tmin, float tmax, hit_record& rec) const;
#if ((TYPE == 1) || (TYPE ==2))vec3 center;float intercept_x;float intercept_y;float intercept_z;float height_half_y;
#endif // TYPEmaterial *ma;float rho, theta, num;
#if TYPE == 3float matrix_c_x[4][4], matrix_c_y[4][4], matrix_c_z[4][4];vec3 bezier3_bl, bezier3_bh;
#endif // TYPE
};#endif // PARAMETRIC_SURFACE_H

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

main.cpp

/*这个文件bicubic Bezier surface,bicubic b-spline surface是完全一样的*/

//1vec3 ctrl_points[16] = {vec3(-3, 2,  0), vec3(-2, 3,  0), vec3(2, 3,  0), vec3(3, 2,  0),vec3(-3, 5, -2), vec3(-2, 5, -2), vec3(2, 5, -1), vec3(3, 5, -2),vec3(-3, 5, -4), vec3(-2, 5, -4), vec3(2, 5, -3), vec3(3, 5, -4),vec3(-3, 2, -6), vec3(-2, 3, -6), vec3(2, 3, -4), vec3(3, 2, -6)};hitable *list[1];list[0] = new parametric_surface(new lambertian(vec3(1.0, 0.0, 0.0)), 0.05, 20, 200);hitable *world = new hitable_list(list,1);vec3 lookfrom(10, 10, 10);vec3 lookat(0, 3, -2);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);

输出图片bicubic Bezier surface(前),bicubic b-spline surface(后)对比:

#if TYPE == 3

#define UN 16

#define VN 16

#endif // TYPE

//1

vec3 ctrl_points[4][4] = {vec3(-3, 2,  0), vec3(-2, 3,  0), vec3(2, 3,  0), vec3(3, 2,  0)},

{vec3(-3,5, -2), vec3(-2, 5, -2), vec3(2, 5, -1), vec3(3, 5, -2)},

{vec3(-3,5, -4), vec3(-2, 5, -4), vec3(2, 5, -3), vec3(3, 5, -4)},

{vec3(-3,2, -6), vec3(-2, 3, -6), vec3(2, 3, -4), vec3(3, 2, -6)};

//2

vec3 ctrl_points[16] = {vec3(-3, 2,  0), vec3(-2, 3,  0), vec3(2, 3,  0), vec3(3, 2,  0)},

{vec3(-3,5, -2), vec3(-2, 5, -2), vec3(2, 4, -1), vec3(3,3, -2)},

{vec3(-3,5, -4), vec3(-2, 5, -4), vec3(2, 4, -3), vec3(3,3, -4)},

{vec3(-3,2, -6), vec3(-2, 3, -6), vec3(2, 3, -4), vec3(3, 2, -6)};

//3

vec3 ctrl_points[16] = {vec3(-3,2,  0), vec3(-2, 3,  0), vec3(2, 3,  0), vec3(3, 2,  0)},

{vec3(-3,5, -2), vec3(-2, 5, -2), vec3(2, 2, -1), vec3(3,1, -2)},

{vec3(-3,5, -4), vec3(-2, 5, -4), vec3(2, 2, -3), vec3(3,1, -4)},

{vec3(-3,2, -6), vec3(-2, 3, -6), vec3(2, 3, -4), vec3(3, 2, -6)};

//4

vec3ctrl_points[16] = {vec3(-3, 2,  0),vec3(-2, 3,  0), vec3(2, 5,  0), vec3(3, 5,  0)},

{vec3(-3,5, -2), vec3(-2, 5, -2), vec3(2, 2, -1), vec3(3, 1, -2)},

{vec3(-3,5, -4), vec3(-2, 5, -4), vec3(2, 2, -3), vec3(3, 1, -4)},

{vec3(-3,2, -6), vec3(-2, 3, -6), vec3(2, 5, -4), vec3(3,5, -6)};

//5

vec3 ctrl_points[16] = {vec3(-3, 2,  0), vec3(-2, 3,  0), vec3(2, 5,  0), vec3(3, 5,  0)},

{vec3(-3,5, -2), vec3(-2, 5, -2), vec3(2, 0, -1), vec3(3, -1, -2)},

{vec3(-3,5, -4), vec3(-2, 5, -4), vec3(2, 0, -3), vec3(3,-1, -4)},

{vec3(-3,2, -6), vec3(-2, 3, -6), vec3(2, 5, -4), vec3(3, 5, -6)};

//11

vec3 ctrl_points[16] = {vec3(-3,2,  0), vec3(-2, 3,  0), vec3(2, 5,  0), vec3(-6, 3,  0),

vec3(-3, -1,-2), vec3(-2, 5, -2), vec3(2, 0, -1), vec3(-6,  3, -2),

vec3(-3, -1,-4), vec3(-2, 5, -4), vec3(2, 0, -3), vec3(-6,  3, -4),

vec3(-3, 2, -6), vec3(-2, 3, -6), vec3(2,5, -4), vec3(-6,  3, -6)};

问题五十六:怎么用ray tracing画参数方程表示的曲面(3)—— b-spline surface相关推荐

  1. 问题五十三:怎么用ray tracing画参数方程表示的曲面(1)

    首先,以球面为例学习怎么用ray tracing画参数方程表示的曲面:然后,再画一个牛角面. 特别说明:这一章节所画的曲面只是示意性的,所以先不care图片上的瑕疵. 53.1 数学推导 球面的参数方 ...

  2. 问题五十四:怎么用ray tracing画参数方程表示的曲面(2)—— bezier surface

    首先,需要说明的是: 这一章节可以看作"问题五十三"的另一个例子--bicubic bezier surface: 之前已经用"球面"和"牛角面&qu ...

  3. 问题五十:怎么用ray tracing画blobs

    这一节,画这个: 参考文献: Blinn, J.F., A generalization of algebraic surfacedrawing. ACM Trans. Graph. 1(3) , 2 ...

  4. 问题六十:怎么用ray tracing画回旋体(rotational sweeping / revolution)

    60.1 概述 回旋体,大概是长这个样子: 回旋体是指曲线(称为"基本曲线")围绕y轴转一圈得到的图形. (基本曲线是由多段b-spline曲线段连接而成) 这里先强调一下: 上图 ...

  5. 问题五十七:怎么用ray tracing画translational sweeping图形

    57.1 概述 我们这里考虑的translational sweeping是XOZ平面的封闭曲线沿着y轴平移得到的图形.类似于如下图形:我们把这种图形称为"prism".我们这里的 ...

  6. 问题五十一:怎么用ray tracing画tear drop

    tear drop是长这个样子的: 51.1 数学推导 在网上找到tear drop的参数方程: 51.2 看C++代码实现 ------------------------------------- ...

  7. 问题六十七:ray tracing学习总结(2016.11.13, 2017.02.05)

    从2016.11.13开始接触ray tracing到今天2017.02.05,差不多80天的时间.截至当前,学习ray tracing的过程,也是我重新找回自己或者说是"find what ...

  8. Python编程基础:第五十六节 filter函数Filter

    第五十六节 filter函数Filter 前言 实践 前言 filter函数的作用是对可迭代对象内部的元素按照特定条件进行过滤,其书写方式为filter(function, iterable),第一个 ...

  9. OpenCV学习笔记(五十六)——InputArray和OutputArray的那些事core OpenCV学习笔记(五十七)——在同一窗口显示多幅图片 OpenCV学习笔记(五十八)——读《Mast

    OpenCV学习笔记(五十六)--InputArray和OutputArray的那些事core 看过OpenCV源代码的朋友,肯定都知道很多函数的接口都是InputArray或者OutputArray ...

最新文章

  1. 21.Ubuntu安装软件时出现无法获得锁 /var/lib/dpkg/lock-frontend的问题解决
  2. 模板上 php dede,织梦CMS模板中dede标签使用php和if判断语句的方法
  3. 【数据结构】排序算法及优化整理
  4. [Leetcode] Reverse Integer
  5. A. 树与路径(树论/多项式/分治FFT)
  6. 模拟——生活大爆炸版石头剪刀布(洛谷 P1328)
  7. Eslint Standard Style语法规则
  8. WCF 第十二章 对等网 使用自定义绑定实现消息定向
  9. 怎么用鼠标选中java中table的某一行_为什么同事的工作效率那么高?学会这些鼠标双击技巧,你也可以的...
  10. idea中配置mysql插件,使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置
  11. 【百度网盘】老罗android开发视频教程[压缩后3.63G]
  12. 菜鸟教程笔记:TypeScript
  13. Dreamweaver CC 2019中文版
  14. PrestoDB 大数据查询引擎
  15. latex IEEEtran bib参考文献title双引号
  16. python怎么做q检验_关于eviews做时间序列模型的残差Q统计量检验我决定写一些!...
  17. 2分钟实战QQ机器人教程(保姆级)手把手教你极速开发
  18. Mac不同应用之间切换使用不同输入法
  19. 鹤林全集·怡情枫林 | 第二篇——励志创造奇迹
  20. 第四周——爬虫入门 Day3 7.20

热门文章

  1. linux不能上网问题
  2. DB2 V10.5 PureScale支持HADR
  3. C#学习笔记(十):反射
  4. 思科全球云指数:2010-2015预测报告
  5. 数据分析能不能替代Data Mining?
  6. pytorch convLSTM实现
  7. 对方差,协方差,相关系数,协方差矩阵的理解与比较
  8. Java同步数据结构之ConcurrentLinkedQueue
  9. 感想篇:11)只怀了1/4的才是不够的
  10. k8s之创建etcd集群