第02章何和变换.docx

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第02章何和变换

第二章几何和变换几乎所有图形软件都以几何类(geometric classes, 这里指c++类)为基础.这些类表示了诸如点,向量,光线等等的数学构件. 由于我们在系统中会到处用到这些类, 良好的抽象和有效的实现至关重要. 本章会讲解pbrt的几何基础的接口和实现.几何类见文件 core/geometry.h 和core/geometry.cpp.变换矩阵见文件 core/transform.h 和core/transform.cpp.2.1 坐标系统pbrt用三个浮点数坐标值x,y,z来表示三维点,向量和法向量. 当然,这些值只有在一个给定的坐标系下才有意义: 给定一个原点和三个定义x,y,z轴的向量,就定义了这个坐标系(frame).在n维空间中, 坐标系的原点P0和其n个线性无关的基向量定义了n维仿射空间(affine space).所有空间中的向量V可以被表达成为基向量(V1,V2, ..., Vn)的线性组合:? ???V = s1V1 + s2V2 + ... + snVn? ?? ???(s1, s2, ... sn是唯一存在的一组纯量, 被称为V关于基(V1,V2...Vn)的表达).同样地, 对与点P而言, 它可用原点P0和基向量(V1,V2, ..., Vn)表达:? ???P = P0 +??s1V1 + s2V2 + ... + snVn以上讨论有点循环定义的味道: 要定义坐标系我们需要定义一个点和一组向量, 而点和向量只有在给定的一个坐标系下才有意义. 因此,我们需要一个标准坐标系, 其原点是(0,0,0), 基向量为(1,0,0), (0,1,0) 和(0,0,1).2.1.1 左/右手坐标系我们知道坐标系分左手坐标系和右手坐标系,pbrt用左手坐标系.2.2 向量Geometry Delcarations =? ?? ???class COREDLL Vector {? ? public:? ?? ???Vector Public Methods ? ?? ???Vector Public Data ? ? };一个向量表达了三维空间内的一个方向, 它由三个浮点数定义:Vector Public Data=? ? float x, y, z;? ?x,y,z被定义为公共成员, 不太符合C++的封装原则, 但我们这样做是为了代码的清晰和效率.缺省情况下, (x,y,z)被设成0. 用户可以选择给定任意值:Vector Public Methods=? ???Vector(float _x = 0, float _y = 0, float _z = 0)? ?? ?? ?? ?? ?? ?: x(_x), y(_y), z(_z) {? ? }2.2.1 向量运算向量加法运算:? ?? ? Vector Public Methods +=? ? Vector operator+(const Vector v) const {? ?? ???return Vector(x+v.x, y + v.y, z + v.z);? ? }? ? Vector operator+=(const Vector v) const {? ?? ???x += v.x;??y += v.y;??z += v.z;? ?? ???return *this;? ? }向量减法运算与上类似, 略.2.2.2 比例运算比例运算是纯量乘法, 即是将向量每个分量乘以一个纯量, 从而改变了它的长度.? ?? ? Vector Public Methods +=? ? Vector operator*(float f) const {? ?? ???return Vector(f*x,??f*y, f*z);? ? }? ? Vector operator*=(const Vector v) const {? ?? ???x??*=f;??y *= f;??z??*= f;? ?? ???return *this;? ? }? ?? ?Geometry Inline Functions =? ? inline Vector operator*(float f, const Vector v) {? ?? ???return v*f;? ? }??类似地,我们可以定义纯量除法 operator/ 和 operator /=, 此略.? ?Vector类还有一个取负值的单操作符定义, 用来返回一个方向相反的向量:? ?? ?? ? Vector Public Methods +=? ? Vector operator-() const {? ?? ???return Vector(-x, -y, -z);? ? }????下面两个函数可以用索

您可能关注的文档

文档评论(0)

skvdnd51 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档