Camera类定义和实现

类声明:
#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;
}
Camera类定义和实现的更多相关文章
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 几种常用的JS类定义方法
几种常用的JS类定义方法 // 方法1 对象直接量var obj1 = { v1 : "", get_v1 : function() { return ...
- Js 类定义的几种方式
提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...
- android.hardware.Camera类及其标准接口介绍
android.hardware.Camera类及其标准接口介绍,API level 19 http://developer.android.com/reference/android/hardwar ...
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
原文 http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...
- YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)
2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec 内存限制: 128 MB 提交: 183 解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...
- Camera类
Camera类 使用 Camera 类可从连接到运行 Flash Player 的计算机的摄像头中 捕获视频. 使用 Video 类可在本地监视视频. 使用 NetConnection 和 NetS ...
- Objective-c 类接口 (@interface) (类定义)
在Objective-c中如何定义一个类呢?我们可以使用下面的格式进行表示: @interface 类名:父类名{ 变量定义; } 方法定义: @end; 下面给出一个实例: @interface P ...
随机推荐
- SSH管理多密钥
生成密钥对 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 默认情况下在~/.ssh目录下生成id_rsa和id_r ...
- datax在解析完配置后,会将core.json,job.json,plugin.json合并内容
{ "common": { "column": { "dateFormat": "yyyy-MM-dd", " ...
- CSP 2021 总结
CSP 2021 总结 PJ 开题顺序:1342 应该先做 T2 ,导致我 T2 直接看错 T1.T3 T1 :直接推规律即可,考场的想法应该正确 T3 :好家伙直接 map 走起 T2 最崩溃的来了 ...
- vue虚拟dom和diff算法
vue的虚拟dom和diff算法 1.虚拟dom 虚拟dom,我的理解就是通过js对象的方式来具体化每一个节点,把dom树上面的每个节点都变为对象里的一个元素,元素的子元素变为子节点,节点上面的cla ...
- flink窗口分类
窗口分类 按照驱动类型分类 窗口本身是截取有界数据的一种方式,所以窗口一个非常重要的信息就是"怎样截取数据".换句话说,就是以什么标准来开发和结束数据的截取. 按照驱动类型分类主要 ...
- 29.MySQL高级SQL语句
MySQL高级SQL语句 目录 MySQL高级SQL语句 创建两个表 SELECT DISTINCT WHERE AND OR IN BETWEEN 通配符 LIKE ORDER BY 函数 数学函数 ...
- Python-安装lmdb失败-解决方法
使用pip install lmdb 时报错 ERROR: Command errored out with exit status 1: python setup.py egg_info Check ...
- 【Pr】基础流程
新建工程 1.打开Pr 2.点击"新建""项目" 3.在电脑磁盘上新建好项目想要存放的位置,比如Demo1,为了便于管理,我先新建了一个Demo文件夹,再在里边 ...
- SAP Web Dynpro - 应用程序中的服务调用
您可以使用服务调用来调用Web Dynpro组件中的现有功能模块. 要创建服务呼叫,您可以使用Web Dynpro工具中易于使用的向导. 您可以在ABAP工作台中启动该向导以创建服务调用. 步骤1-选 ...
- 一文看完vue3的变化之处
在通读了vue的官网文档后,我记录下了如下这些相对于2.x的变化之处. 1.创建应用实例的变化 之前一般是这样: let app = new Vue({ // ...一些选项 template: '' ...