pbrt笔记--第二章 几何与变换
个人总结:这一章主要是解释图形学的一些基本概念和运算,比较简单,本文只记录一些个人认为比较重要的地方。
2.1 坐标系统
pbrt的工程使用的是左手坐标系。
2.2~2.4
主要讲向量,点的定义以及他们的一些基本操作,都比较简单,在此不提。
2.5 Rays(射线)
个人理解:ray是离线渲染中的除了向量和点外另一个最重要也最基础几何定义了,因为光就是用射线表示的.
定义:一条ray是一个半关闭-无穷(semi-infinite),用一个原点和一个方向定义。如下图:
伪代码如下:
class Ray {
public:
// Ray Public Methods
Ray() : tMax(Infinity), time(0.f), medium(nullptr) {}
Ray(const Point3f &o, const Vector3f &d, Float tMax = Infinity,
Float time = 0.f, const Medium *medium = nullptr)
: o(o), d(d), tMax(tMax), time(time), medium(medium) {}
//省了...
// Ray Public Data
Point3f o;
Vector3f d;
mutable Float tMax;
Float time;
const Medium *medium;
};
ray的参数化形式是:
r(t) = o+td 0<t <∞.
可以看到每个ray都会有一个time和它关联,其实每个time会对应着射线上的一个point。
2.5.1 Ray Differentials
可以理解为ray的微分或者ray的偏移,它主要是后面用来做纹理抗锯齿用的,RayDifferential是Ray的子类,它内部有两条辅助射线,分别代表摄像头射线相对于main ray在x方向和y方向上偏移一个采样点的两条射线,现在没用到可以先不管。
2.6 Bounding Boxes(包围盒)
包围盒,说白了就是用一个简单的几何体(例如立方体)把一个可能复杂的几何体包围起来,主要是用来在计算交点中加速用的(后面的章节才会用到),有很多种包围盒,pbrt中使用的是AABBs包围盒(axis- aligned bounding boxes),也就是和坐标轴对齐的包围盒。
一个3D AABB可以用一个向量和三个长度描述,也可以用盒子的两个对角线的点描述,pbrt中使用的是后者。代码简略如下:
template <typename T>
class Bounds3 {
public:
// Bounds3 Public Methods
//略
// Bounds3 Public Data
Point3<T> pMin, pMax;
};
如下图:
Bounds3 class的成员函数中定义了包围盒的一些基本运算,如求包围盒的8个角的坐标(Corner),生成一个能包围住一到多个的boxs的新box(Union),求两个box的相交的部分(Intersect),求两个box是否有交集(Intersect),详见书中。
2.7 变换操作
主要讲了一些3D的矩阵变换,如平移,缩放,旋转,还有齐次坐标等,因为太基础了,略过不提。
2.8 变换的应用
点和向量的变换,略过不提,记录一下法线的变换。法线变换不能直接和变换矩阵相乘,因为直接相乘有些情况下变换后的法线和切线不垂直了。如下图:
图中a是一个圆形,图b将a图中的圆在y轴上缩小一半,法线如果简单的在y轴缩小一半,就和椭圆的切线不再垂直,c图是正确的法线变换。
正确的法线变换的推导是,首先我们知道原法线n和表面的切线t垂直,也就是
n · t = nT t = 0.
当我们用矩阵M对表面上的一点变换时,新的切线向量t'等于Mt。假设法线的变换矩阵为S, 转换后的法线为n'等于Sn,我们有如下:
0 = n'T t' = (Sn)TMt = nTSTMt
因此STM = I,也就是单位矩阵。因此有ST = M-1, S = (M-1)T.
2.9 Animating Tansformations
此为选读内容,还没怎么研究,先略过。