类声明:

#pragma once
#ifndef __CAMERA_HEADER__
#define __CAMERA_HEADER__ #include "../utilities/geometry.h" class World; class Camera {
public:
Camera();
Camera(const Camera& cam);
~Camera();
void set_eye(const Point3& p);
void set_lookat(const Point3& p);
void set_up(const Vector3& v);
void set_roll(const ldouble a);
void set_exposure_time(const ldouble t);
void compute_uvw();
virtual Camera* clone() const = 0;
virtual void render_scene(World& w) = 0;
Camera& operator=(const Camera& cam);
protected:
Point3 eye, lookat;
Vector3 up, u, v, w;
ldouble exposure_time, ra;
}; #endif  

类实现:

#include "pch.h"
#include "camera.h" Camera::Camera()
:eye(0, 0, 1), lookat(0), ra(0), up(0, 1, 0), u(1, 0, 0), v(0, 1, 0), w(0, 0, 1), exposure_time(1) {} Camera::Camera(const Camera& cam)
: eye(cam.eye), lookat(cam.lookat), ra(cam.ra), up(cam.up),
u(cam.u), v(cam.v), w(cam.w), exposure_time(cam.exposure_time) {} Camera::~Camera() {} void Camera::set_eye(const Point3& p) {
eye = p;
} void Camera::set_lookat(const Point3& p) {
lookat = p;
} void Camera::set_up(const Vector3& v) {
up = v;
} void Camera::set_roll(const ldouble a) {
ra = a;
} void Camera::set_exposure_time(const ldouble t) {
exposure_time = t;
} void Camera::compute_uvw() {
w = eye - lookat;
w.normalize();
u = up ^ w;
u.normalize();
v = w ^ u;
if (eye.x == lookat.x && eye.z == lookat.z && eye.y > lookat.y) { // camera looking vertically down
u = Vector3(0, 0, 1);
v = Vector3(1, 0, 0);
w = Vector3(0, 1, 0);
}
if (eye.x == lookat.x && eye.z == lookat.z && eye.y < lookat.y) { // camera looking vertically up
u = Vector3(1, 0, 0);
v = Vector3(0, 0, 1);
w = Vector3(0, -1, 0);
}
} Camera& Camera::operator=(const Camera& cam) {
if (this == &cam)
return *this;
eye = cam.eye;
lookat = cam.lookat;
ra = cam.ra;
up = cam.up;
u = cam.u;
v = cam.v;
w = cam.w;
exposure_time = cam.exposure_time;
return *this;
}

 

最新文章

  1. 如何安装sublime text2以及它的插件?
  2. 更改EGit的user settings中默认的location
  3. 【JavaScript学习笔记】鼠标样式
  4. IntelliJ IDEA 15 部署Tomcat及创建一个简单的Web工程
  5. C#中判断一个网址是否可以打开
  6. Contains Duplicate II ——LeetCode
  7. 《Effective C++》:条款48:理解力template 元编程
  8. [LeetCode107]Binary Tree Level Order Traversal II 二叉树层次遍历
  9. 如何保存PDF、Word和Excel文件到数据库中
  10. MongoDB之DBref(关联插入,查询,删除) 实例深入
  11. Go语言生成随机数
  12. numpy.loadtxt用法
  13. nginx+php 开启https
  14. BigDecimal的用法详解(保留两位小数,四舍五入,数字格式化,科学计数法转数字,数字里的逗号处理)
  15. 找峰值I II &#183; Find Peak Element I ii
  16. 【XSY2753】LCM
  17. 【ArcGIS for SivlerLight api(3)】基础图层增删改查
  18. Objective-C 构造方法 分类 类的深入研究
  19. UVA - 11995 模拟
  20. 算法Sedgewick第四版-第1章基础-005一封装输入(可以文件,jar包里的文件或网址)

热门文章

  1. vue ui 创建vue项目 没反应的解决办法 2021
  2. RealEvo-IDE安装
  3. Hapoop安装学习(第一天)
  4. 安装vsFTP到CentOS(YUM)
  5. spring-boot @Async注解 解决异步多线程入库的问题
  6. GraphX 图计算实践之模式匹配抽取特定子图
  7. markdowm使用学习
  8. HMS Core 视频编辑服务开放模板能力,助力用户一键Get同款酷炫视频
  9. 『忘了再学』Shell流程控制 — 34、if条件判断语句(二)
  10. Windows-VS2017创建.NET项目