第02章几何和变换选读.docx

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

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档