pbrt笔记--第二章 几何与变换

2019-11-05  本文已影响0人  奔向火星005

个人总结:这一章主要是解释图形学的一些基本概念和运算,比较简单,本文只记录一些个人认为比较重要的地方。

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

此为选读内容,还没怎么研究,先略过。

上一篇下一篇

猜你喜欢

热点阅读