第02章几何和变换..docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第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,1,2方便地使用向量的各个分量: v[0]得到x值, v[1]得到y值, v[2]得到z值. Vector Public Methods += float operator[](int i) const {?Assert(i = 0 i = 2);?return ( x); } float operator[](int i) {?Assert(i = 0

文档评论(0)

sd7f8dgh + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档