当前位置: 首页 > wzjs >正文

陕西建设集团韩城公司网站苏州网站建设公司排名

陕西建设集团韩城公司网站,苏州网站建设公司排名,网站制作什么品牌好,房屋设计怎么收费之前的采样章节,开发了相对于z轴生成随机方向的方法,但是这个方法过于的片面,我们不能够保证所有的法线都与z轴对齐,我们需要考虑到不同的方向。 Relative Coordinates 标准正交基(ONB)是由三个相互正交的…

之前的采样章节,开发了相对于z轴生成随机方向的方法,但是这个方法过于的片面,我们不能够保证所有的法线都与z轴对齐,我们需要考虑到不同的方向。

Relative Coordinates

标准正交基(ONB)是由三个相互正交的单位向量组成的集合。它是坐标系的一种严格子类型。笛卡尔 xyz 轴就是标准正交基的一个例子。我们所有的渲染结果,都是场景中物体的相对位置和方向投影到相机图像平面上得到的。相机和物体必须在同一坐标系中进行描述,这样投影到图像平面上的操作在逻辑上才是明确的,否则相机就没有确切的方法来正确渲染物体。要么必须在物体的坐标系中重新定义相机,要么必须在相机的坐标系中重新定义物体。最好一开始就让两者处于同一坐标系,这样就无需重新定义。只要相机和场景在同一坐标系中描述,一切就没问题。标准正交基定义了空间中距离和方向的表示方式,但仅有标准正交基是不够的。物体和相机需要通过它们相对于一个共同定义位置的位移来描述。这就是场景的原点 O,它代表了所有物体位移所参照的 “宇宙中心”。

例如我们有原点O以及标准的正交基x, y, z,若一个位置是(3,-2,7)则我们也可以表达为:

Location is O+3x−2y+7z

Generating an Orthonormal Basis(生成正交基)

这个过程概括的来讲就是我们有一个法线的方向向量。我们需要去定义一个a向量,然后通过叉积计算出垂直这两个向量的向量s,然后通过n和s的叉积得到另一个正交向量t。

a的定义不能与向量n平行

if (std::fabs(n.x()) > 0.9)a = vec3(0, 1, 0)
elsea = vec3(1, 0, 0)

于是我们就可以写出这样的一个ONB类

ONB Class

#ifndef ONB_H
#define ONB_Hclass ONB
{
public:ONB(const vec3& n){axis[2] = unit_vector(n);vec3 a  = (std::fabs(axis[2].x()) > 0.9) ? vec3(0, 1, 0) : vec3(1, 0, 0);axis[1] = unit_vector(cross(axis[2], a));axis[0] = unit_vector(cross(axis[2], axis[1]));}const vec3& u() const { return axis[0]; }const vec3& v() const { return axis[1]; }const vec3& w() const { return axis[2]; }vec3 transform(const vec3& v) const {return v.x() * axis[0] + v.y() * axis[1] + v.z() * axis[2];}
private:vec3 axis[3];
};#endif

采样散射的光线

之前的在半球上进行余弦采样,采样的结果在靠近normal的部分概率会大一点,记得在vec的头文件中进行编辑

inline vec3 random_cosine_direction()
{vec3 ret;double r1 = random_double();double r2 = random_double();double z = std::sqrt(1.0 - r2);double phi = 2 * pi * r1;double x = std::cos(phi) * std::sqrt(r2);double y = std::sin(phi) * std::sqrt(r2);return vec3(x, y, z);
}
class lambertian : public material{
public:...bool scatter(const Ray& r_in,const hit_record& rec,color& attenuation,Ray& scattered, double& pdf) const override{ONB onb(rec.normal);vec3 direction = random_cosine_direction();direction = onb.transform(direction); // from local to worldpdf = dot(onb.w(), direction) / pi;scattered = Ray(rec.p, direction, r_in.time());attenuation = tex->value(rec.u,rec.v,rec.p);return true;}
...
color ray_color(const Ray& r,int depth,const hittable& world) const{if(depth <= 0 ){return color(0,0,0);}hit_record rec;if(!world.hit(r,interval(0.001,infinity),rec)){ return background; }color attenuation;Ray scattered;double pdf_value;color color_from_emission = rec.mat->emitted(rec.u,rec.v,rec.p);if(!rec.mat->scatter(r,rec,attenuation,scattered, pdf_value)){return color_from_emission;}double scatter_pdf = rec.mat->scattering_pdf(r, rec, scattered);color color_from_scatter = (scatter_pdf * attenuation * ray_color(scattered,depth-1,world)) / pdf_value;return color_from_emission + color_from_scatter;
}

更新一下isotropic(各向同性) 材质

virtual double scattering_pdf(const Ray& r_in, const hit_record& rec, const Ray& scattered)
const override
{return 1.0 / (4 * pi);
}
virtual bool scatter(
const Ray& r_in,const hit_record& rec,color& attenuation,Ray& scattered, double& pdf
) const  override{scattered = Ray(rec.p,random_unit_vector(),r_in.time());attenuation = tex -> value(rec.u,rec.v,rec.p);pdf = 1.0 / (4 * pi);return true;
}
http://www.dtcms.com/wzjs/333395.html

相关文章:

  • 完全自定义纯代码打造你的wordpress站点侧边栏互联网营销师国家职业技能标准
  • 新疆工程建设网站上查询系统培训机构查询网
  • 百度关键词网站怎么做seo排名查询工具
  • 做一元夺宝网站需要什么条件新闻最新消息10条
  • seo的优化原理seo关键词排名优化评价
  • 百度搜索排名怎么做深圳抖音seo
  • 外贸网站建设推广公司友情链接又称
  • 上海虹口网站制作seo案例模板
  • 南海网站设计搜索引擎优化需要多少钱
  • 网站交互图片怎么做营销型网站推广方案
  • 大连建设网中标公司安卓aso优化
  • 个人做营利性质网站会怎么样品牌运营策略
  • java网站开发免费b2b推广网站
  • 从零学做网站企业互联网推广
  • 城关区建设局网站武汉关键词排名推广
  • 一学一做教育视频网站销售管理软件
  • 淘宝禁止了网站建设类google搜索网址
  • 企业网站建设公司排名东莞优化网站关键词优化
  • 网站 linux 服务器企业推广是什么意思
  • 北京联通网站备案域名注册商怎么查
  • 房源开发网站英雄联盟世界排名
  • 集团网站建设哪家好seo网站推广助理
  • 什么网站可以兼职做设计长沙免费建站网络营销
  • 宁波网站建设设计公司百度关键词优化有效果吗
  • 深圳做网上商城网站直播引流推广方法
  • 网站制作开发及优化是什么搜狐财经峰会直播
  • 如何做一款服装网站雅思培训班价格一般多少
  • 网络规划设计师报考苏州优化网站公司
  • app开发公司软件开发公司seo应该怎么做
  • 可以做设计兼职的网站有哪些怎么制作网站?