类声明:

#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类定义和实现的更多相关文章

  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. 151-模型-Power BI&Power Pivot模型DAX函数使用量分析

    151-模型-Power BI&Power Pivot模型DAX函数使用量分析 1.背景 我们在 Power BI 或者 Power Pivot 项目中会写很多的 DAX 表达式.在最后项目交 ...

  2. SyntaxError: Non-UTF-8 code starting with '\xef' in file(已解决)

    错误原因: python代码中出现了中文字符 解决方案: 在python代码文件的第一行(必须是第一行)添加如下代码(随编码不同自行修改): #coding=utf-8

  3. 面试突击51:为什么单例一定要加 volatile?

    单例模式的实现方法有很多种,如饿汉模式.懒汉模式.静态内部类和枚举等,当面试官问到"为什么单例模式一定要加 volatile?"时,那么他指的是为什么懒汉模式中的私有变量要加 vo ...

  4. 「ARC 139F」Many Xor Optimization Problems【线性做法,踩标】

    「ARC 139F」Many Xor Optimization Problems 对于一个长为 \(n\) 的序列 \(a\),我们记 \(f(a)\) 表示从 \(a\) 中选取若干数,可以得到的最 ...

  5. 我是一个Dubbo数据包...

    hello,大家好呀,我是小楼! 今天给大家带来一篇关于Dubbo IO交互的文章,本文是一位同事写的文章,用有趣的文字把枯燥的知识点写出来,通俗易懂,非常有意思,所以迫不及待找作者授权然后分享给大家 ...

  6. vue组件data函数

    vue组件data通常定义为一个函数并return一个对象,对象中定义的就是组件数据,当然定义数据还有props.computed等方式. data如果直接定义为对象data: {message: ' ...

  7. B 树的简单认识

    理解 B 树的概念 B 树是一种自平衡的查找树,能够保持数据有序.这种数据结构能够让查找数据.顺序访问.插入数据及删除数据的动作,都能在对数时间内完成. 同一般的二叉查找树不同,B 树是一棵多路平衡查 ...

  8. Gitee整改之思考

    本文主要内容如下: 1.Gitee是什么? 2.Gitee与Github的区别有哪些? 3.为什么要使用Gitee? 4.Gitee的商业模式是怎样的? 5.Gitee为何会被整改? 6.Gitee这 ...

  9. flowable与camunda性能测试对比分析

    前言 目前主流的Java开源流程引擎有Activiti.Flowable.Camunda,笔者在进行流程引擎技术选型时,除了功能方面,性能和稳定性是尤其关注的指标,是选择Flowable?还是Camu ...

  10. JS 会有变量提升和函数提升

    JavaScript变量函数声明提升(Hoisting)是在 Javascript 中执行上下文工作方式的一种认识(也可以说是一种预编译),从字面意义上看,"变量提升"意味着变量和 ...