类声明:

  1. #pragma once
  2. #ifndef __CAMERA_HEADER__
  3. #define __CAMERA_HEADER__
  4.  
  5. #include "../utilities/geometry.h"
  6.  
  7. class World;
  8.  
  9. class Camera {
  10. public:
  11. Camera();
  12. Camera(const Camera& cam);
  13. ~Camera();
  14. void set_eye(const Point3& p);
  15. void set_lookat(const Point3& p);
  16. void set_up(const Vector3& v);
  17. void set_roll(const ldouble a);
  18. void set_exposure_time(const ldouble t);
  19. void compute_uvw();
  20. virtual Camera* clone() const = 0;
  21. virtual void render_scene(World& w) = 0;
  22. Camera& operator=(const Camera& cam);
  23. protected:
  24. Point3 eye, lookat;
  25. Vector3 up, u, v, w;
  26. ldouble exposure_time, ra;
  27. };
  28.  
  29. #endif  

类实现:

  1. #include "pch.h"
  2. #include "camera.h"
  3.  
  4. Camera::Camera()
  5. :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) {}
  6.  
  7. Camera::Camera(const Camera& cam)
  8. : eye(cam.eye), lookat(cam.lookat), ra(cam.ra), up(cam.up),
  9. u(cam.u), v(cam.v), w(cam.w), exposure_time(cam.exposure_time) {}
  10.  
  11. Camera::~Camera() {}
  12.  
  13. void Camera::set_eye(const Point3& p) {
  14. eye = p;
  15. }
  16.  
  17. void Camera::set_lookat(const Point3& p) {
  18. lookat = p;
  19. }
  20.  
  21. void Camera::set_up(const Vector3& v) {
  22. up = v;
  23. }
  24.  
  25. void Camera::set_roll(const ldouble a) {
  26. ra = a;
  27. }
  28.  
  29. void Camera::set_exposure_time(const ldouble t) {
  30. exposure_time = t;
  31. }
  32.  
  33. void Camera::compute_uvw() {
  34. w = eye - lookat;
  35. w.normalize();
  36. u = up ^ w;
  37. u.normalize();
  38. v = w ^ u;
  39. if (eye.x == lookat.x && eye.z == lookat.z && eye.y > lookat.y) { // camera looking vertically down
  40. u = Vector3(0, 0, 1);
  41. v = Vector3(1, 0, 0);
  42. w = Vector3(0, 1, 0);
  43. }
  44. if (eye.x == lookat.x && eye.z == lookat.z && eye.y < lookat.y) { // camera looking vertically up
  45. u = Vector3(1, 0, 0);
  46. v = Vector3(0, 0, 1);
  47. w = Vector3(0, -1, 0);
  48. }
  49. }
  50.  
  51. Camera& Camera::operator=(const Camera& cam) {
  52. if (this == &cam)
  53. return *this;
  54. eye = cam.eye;
  55. lookat = cam.lookat;
  56. ra = cam.ra;
  57. up = cam.up;
  58. u = cam.u;
  59. v = cam.v;
  60. w = cam.w;
  61. exposure_time = cam.exposure_time;
  62. return *this;
  63. }

 

Camera类定义和实现的更多相关文章

  1. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  2. 几种常用的JS类定义方法

    几种常用的JS类定义方法   // 方法1 对象直接量var obj1 = {    v1 : "",    get_v1 : function() {        return ...

  3. Js 类定义的几种方式

    提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...

  4. android.hardware.Camera类及其标准接口介绍

    android.hardware.Camera类及其标准接口介绍,API level 19 http://developer.android.com/reference/android/hardwar ...

  5. 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?

    static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...

  6. C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?

    原文  http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++  C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...

  7. YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)

    2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec  内存限制: 128 MB 提交: 183  解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...

  8. Camera类

    Camera类 使用 Camera 类可从连接到运行 Flash Player 的计算机的摄像头中 捕获视频. 使用 Video 类可在本地监视视频. 使用 NetConnection  和 NetS ...

  9. Objective-c 类接口 (@interface) (类定义)

    在Objective-c中如何定义一个类呢?我们可以使用下面的格式进行表示: @interface 类名:父类名{ 变量定义; } 方法定义: @end; 下面给出一个实例: @interface P ...

随机推荐

  1. 好客租房10-jsx的基本使用

    1.1createElement()的问题 1繁琐不简洁 2不直观 无法一眼看出所描述的结构 3不优雅 用户体验不爽 React.createElement("div",     ...

  2. unity---公共模块MonoController

    公共模块 如果有很多类使用Update()函数,会导致性能浪费 如果函数统一在一个Update()中执行 代码 上述,需要将脚本挂载到物体上, 故新建了一个管理类MonoMgr Mgr另外的作用 可以 ...

  3. 记 iTextSharp 剪裁 PDF 指定区域的方法

    原文 引用 itextsharp 5.5.13.2 itextsharp.xtra 5.5.13.2 方法 /// <summary> /// 截取pdf文件,例如把A4截出指定的A6区域 ...

  4. CentOS 7.9 安装 zookeeper-3.7.0

    1. 下载 Zookeeper Zookeeper 官网 使用 wget 下载: wget https://mirrors.bfsu.edu.cn/apache/zookeeper/zookeeper ...

  5. MongoDB 分片规则

    每日一句 生命本身毫无意义,只有死亡才能让你邃晓人性的真谛! 每日一句 Ideal is the beacon. Without ideal, there is no secure direction ...

  6. 目标检测复习之Faster RCNN系列

    目标检测之faster rcnn系列 paper blogs1: 一文读懂Faster RCNN Faster RCNN理论合集 code: mmdetection Faster rcnn总结: 网络 ...

  7. 【HEOI2014】大工程<虚树>

    虚树 我们每天都用心思索着,这究竟是为了什么呢?我想我也不知道,只是觉得如果人不思考问题就很无聊. 我觉得虚树不是什么数据结构,就是一种技巧或者工具.它能把树中\(k\)个关键点以\(O(klogk) ...

  8. JAVA - 线程从创建到死亡的几种状态都有哪些?

    JAVA - 线程从创建到死亡的几种状态都有哪些? 新建( new ):新创建了一个线程对象. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 sta ...

  9. CentOS 8.0与CentOS7.0 防火墙端口设置

    一,开放端口号 firewall-cmd --zone=public --add-port=8080/tcp --permanent  #开启8080端口 firewall-cmd --zone=pu ...

  10. 02 RESTFul接口和HTTP的幂等性分析

    RESTFul接口和HTTP的幂等性分析 REST全称是Representational State Transfer,中文为表述性状态转移,REST指的是一组架构约束条件和原则 RESTful表述的 ...