Pinhole类声明和实现
针孔相机,带旋转,移动等功能。
类声明:
#pragma once
#ifndef __PINHOLE_HEADER__
#define __PINHOLE_HEADER__ #include "camera.h" class Pinhole :public Camera {
public:
Pinhole();
~Pinhole();
Pinhole(const Pinhole& ph);
void set_view_distance(const ldouble a);
void set_zoom(const ldouble factor);
void set_angle(const ldouble deg);
Vector3 ray_direction(const Point3& p) const;
virtual Camera* clone() const;
virtual void render_scene(World& w);
Pinhole& operator=(const Pinhole& ph);
private:
ldouble d, zoom;
};
#endif
类实现:
#include "pch.h"
#include "pinhole.h"
#include "../utilities/world.h"
#include "../utilities/viewplane.h"
#include "../samplers/sampler.h"
#include "../tracers/tracer.h" Pinhole::Pinhole() :Camera(), d(1), zoom(1) {} Pinhole::Pinhole(const Pinhole& ph) : Camera(ph), d(ph.d), zoom(ph.zoom) {} Pinhole::~Pinhole() {} void Pinhole::set_view_distance(const ldouble a) {
d = a;
} void Pinhole::set_zoom(const ldouble factor) {
zoom = factor;
} void Pinhole::set_angle(const ldouble deg) {
ldouble rad = radian(deg);
up = Point3(std::cos(rad) * up.x - std::sin(rad) * up.y,
std::sin(rad) * up.x + std::cos(rad) * up.y, up.z);//绕z轴旋转
} Vector3 Pinhole::ray_direction(const Point3& p) const{
Vector3 dir = p.x * u + p.y * v - w / d;//书中这里是错误的
dir.normalize();
return dir;
} Camera* Pinhole::clone() const {
return new Pinhole(*this);
} void Pinhole::render_scene(World& w) {
ViewPlane vp(w.vp);
Ray ray;
integer depth = 0;
Point3 sp, pp;
w.open_window(vp.hres, vp.vres);
vp.s = 1 / (zoom * vp.s);
ray.o = eye;
for (integer r = vp.vres - 1; r >= 0; r--)//render from left-corner to right-corner
for (integer c = 0; c < vp.hres; c++) {
RGBColor color;
for (integer p = 0; p < vp.nsamples; p++) {
sp = vp.sampler->sample_unit_square();
pp.x = (c - 0.5 * vp.hres + sp.x) * vp.s;
pp.y = (r - 0.5 * vp.vres + sp.y) * vp.s;
ray.d = ray_direction(pp);
color += w.tracer_ptr->trace_ray(ray);
}
color /= vp.nsamples;
color *= exposure_time;
w.display_pixel(r, c, color);
}
} Pinhole& Pinhole::operator=(const Pinhole& ph) {
if (this == &ph)
return *this;
Camera::operator= (ph);
d = ph.d;
zoom = ph.zoom;
return *this;
}
需要修改的World类:
class World {
public:
World();
World(const World& wr);
~World();
void build();
void render();
...
void open_window(const integer hres, const integer vres);
void display_pixel(const integer row, const integer column, const RGBColor& color);
void set_camera(Camera* const cam_ptr);//新加
ViewPlane vp;
Tracer* tracer_ptr;
private:
std::stringstream ss;
std::vector<Geometrics*> objects;
RGBColor backgrd_color;
Camera* camera_ptr;//新加
};
实现代码修改:
void World::build() {
vp.set_hres(200);
vp.set_vres(100);
vp.set_sampler(new Hammersley());
vp.sampler->map_to_sphere();
tracer_ptr = new MultiSphere(this);
Geometrics* obj = new Sphere(0, 0.5);
obj->set_color(RGBColor(1, 0, 0));
add_object(obj);
obj = new Sphere(Point3(0, -100.5, 0), 100);
obj->set_color(RGBColor(0, 0, 1));
add_object(obj);
Pinhole* pinhole = new Pinhole();
pinhole->set_eye(Point3(0, 0, 1));
pinhole->set_lookat(Point3(0));
pinhole->set_view_distance(1.5);//视距测试
pinhole->set_angle(-45);//旋转测试
//pinhole->set_zoom(2.0);//缩放测试
pinhole->compute_uvw();
set_camera(pinhole);
} void World::render() {
camera_ptr->render_scene(*this);
}
测试效果图(左旋转45度图):
Pinhole类声明和实现的更多相关文章
- EC笔记,第二部分:7.为多态基类声明虚析构函数
7.为多态基类声明虚析构函数 1.为多态基类声明虚析构函数 code1: class A{ public: int* a; A():a(new int(5)) {} ~A(){ delete a; } ...
- C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译?
C++ 中的模板类声明头文件和实现文件分离后,如何能实现正常编译? 这个feature叫做Export Template,即外名模板,它的作用在于使得模板代码可依照C/C++语言习惯,将模板声明和实现 ...
- [Effective C++ --007]为多态基类声明virtual析构函数
引言: 我们都知道类的一个很明显的特性是多态,比如我们声明一个水果的基类: class Fruit { public: Fruit() {}; ~Fruit(){}; } 那么我们根据这个Fruit基 ...
- c++,基类声明的指针变量和引用类型变量可以指向派 生类的对象
基类声明的指针变量和引用类型变量可以指向派生类的对象,而反过来派生类的指针却不能指向基类变量. 这与基类和派生类之间,被允许的赋值方向是相反的. 但是从逻辑上很容易推敲其合理性.
- error C2248: “CObject::operator =”: 不可访问 private 员(于“CObject”类声明)
MFC如果编码错误: 演出:error C2248: "CObject::operator =": 不可访问 private 员(于"CObject"类声明) ...
- 类声明、类作用域、前向声明、this指针、嵌套类、PIMPL 技法 等
一.类声明 //类是一种用户自定义类型,声明形式: class 类名称 { public: 公有成员(外部接口) private: 私有 ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- Thinhole类声明和实现
Thinhole类说白了就是在眼睛处,放一个放大镜.就像我们平时用放大镜观察物体一样.这样实现的效果的是,周围会模糊.原理书上都说的很清楚了,我把算法截图下来了.这个应用我猜测是在竞技游戏比如csgo ...
- 07——为多态基类声明为virtual析构函数
当基类确定被继承的时候,析构函数声明为virtual是必须的 当返回的派生类的指针或引用的时候,调用析构函数容易发生内存泄漏 当基类作为抽象类使用,声明pure virtual析构函数 析构函数的顺序 ...
随机推荐
- 811. Subdomain Visit Count - LeetCode
Question 811. Subdomain Visit Count Example 1: Input: ["9001 discuss.leetcode.com"] Output ...
- 好客租房9-jsx的学习目标
1能够知道什么是jsx 2能够使用jsx创建react元素 3能够在jsx使用javascript表达式 4能够使用jsx的条件渲染和列表渲染 5能够给jsx添加样式 jsx的基本使用 jsx中使用j ...
- JAVA - 缓冲和缓存
JAVA - 缓冲和缓存 缓冲 Buffer 功能:协调上下层应用之间的性能差异.通过缓冲区的缓冲,当上层组件性能优于下层组件的时候,缓冲可以有效减少上层组件对下层组件的等待时间. 使用场景:IO流中 ...
- 定制.NET 6.0的依赖注入
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进. 在本章中,我们将学习ASP.NET Core的依赖项注入(DI)以及如何自定义它. ...
- java通过socket实现https get 请求网页
1. 首先要初始化ssl context SSLContext context = SSLContext.getDefault(); socket = (SSLSocket) context.getS ...
- 深度学习与CV教程(14) | 图像分割 (FCN,SegNet,U-Net,PSPNet,DeepLab,RefineNet)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- 基于Kubernetes v1.24.0的集群搭建(三)
1 使用kubeadm部署Kubernetes 如无特殊说明,以下操作可以在所有节点上进行. 1.1 首先我们需要配置一下阿里源 cat <<EOF > /etc/yum.repos ...
- Spring Data JPA系列3:JPA项目中核心场景与进阶用法介绍
大家好,又见面了. 到这里呢,已经是本SpringData JPA系列文档的第三篇了,先来回顾下前面两篇: 在第1篇<Spring Data JPA系列1:JDBC.ORM.JPA.Spring ...
- 【python基础】第01回 计算机基础1
本章内容概要 1.文件路径2.typora主要功能介绍3.typora语法学习(markdown)4.计算机的本质5.计算机五大组成部分6.网络博文编写教程 本章内容详解 1.文件路径 --路径:可以 ...
- Java 将HTML转为Word
本文以Java代码为例介绍如何实现将HTML文件转为Word文档(.docx..doc).在实际开发场景中可参考此方法来转换.下面详细方法及步骤. 在编辑代码前,请先在程序中导入Spire.Doc.j ...