VectorCross Product叉积，简单回顾一下$$ ||\vec{a} \times \vec{b}|| = ||a||||b|| \sin \phi $$而 $\vec{a} \times \vec{b}$ 的方向可以用右手系来判断。在笛卡尔坐标系中，其结果可以用：$$ \vec{a} \times \vec{b} = (y_az_b - z_ay_b, z_ax_b - x_az_b, x_ay_b - y_ax_b) $$Orthonormal BasesConstructing a Basis from a Single Vector利用单个向量构造正交基首先取该向量的方向向量：$$ \vec{w} = \frac{\vec{a}}{||\vec{a}||} $$之后选取任意一个与 $\vec{w}$ 不共线的向量 $\vec{t}$，利用叉积来构造与 $\vec{w}$ 正交的单位向量$$ \vec{u} = \frac{\vec{t} \times \vec{w}}{||\vec{t} \times \vec{w}||} $$Constructing a Basis from a Single Vector将 $\vec{u}$ 构造中的 $\vec{t}$ 替换成第二个向量 $\vec{b}$ 即可。Curves and Surfaces2D Implicit Curves一种常见的描述二维曲线的方法是隐等式（Implicit Equation）。二维曲线的一般形式是：$$ f(x,y) = 0 $$其中， 点 $(x,y)$ 是 $f(x,y)=0$ 的根，表示该点在曲线上。反之则不在。例如，一个圆可以表示为 $f(x,y) = (x-x_c)^2 + (y - y_c)^2 -r^2$ 。因为在曲线上的点并非显式地表达出来，而是要解这个等式，所以成为 Implicit Equation。此外，我们还可以用向量来压缩我们的表达式。如果我们有 $\vec{c} = (x_c, y_c)$ 和 $\vec{p} = (x,y)$，那么以 $(x_c, y_c)$ 为圆心 $r$ 为半径的原则可以用这些满足以下条件的位置向量来表示：$$ (\vec{p} - \vec{c}) \cdot (\vec{p} - \vec{c}) - r^2 = 0 $$由点积的性质可知，该式也等价于：$$ \vert \vert \vec{p} - \vec{c} || -r^2 = 0 $$2D Gradient这一节我们讨论2D梯度假如我们认为 $f(x,y)$ 是一块高地且高度$=f(x,y)$，那么梯度向量指向的是最大向上斜率的方向。梯度向量 $\nabla f(x,y)$ 由下式给出：$$ \nabla f(x,y) = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) $$在一个在隐曲线 $f(x,y) = 0$ 上的点测量的梯度向量是与 tangent vector 在该点垂直的一个向量。这个垂直的向量通常称为 normal vector （法向量）。因为梯度向量指向的是最大向上斜率的方向，这说明了梯度向量指向了 $f(x,y) > 0$ 的区域。3D Implicit Surfaces类似于 2D 的情形，我们可以简单给出 3D Implicit Equation 来描述一个 3D 平面$$ f(x,y,z) = 0 $$同理，可以用向量来表示。有 $\vec{p} =(x,y,z)$ ，上式可以重写为：$$ f(\vec{p}) = 0 $$Surface Normal to an Implicit SurfaceSurface Normal，即法线。其目的是为了减小计算量，是一个垂直于平面的向量。任意一个在平面上的点都有可能有不同的法向量。类似地，梯度为2D隐曲线指出了一条法线，在点 $\vec{p}$ 处的3D平面发现由隐函数的梯度给出：$$ \vec{n} = \nabla f(\vec{p}) = (\frac{\partial f(\vec{p}}{\partial x}, \frac{\partial f(\vec{p})}{\partial y}, \frac{\partial f(\vec{p})}{\partial z}) $$Implicit Planes上面提到了法线。我们是否可以用法线来定义一个平面？假如我们有一个无限平面，穿过点 $\vec{a}$，且在该点有法线 $\vec{n}$。则该平面的 Implicit Equation 可以表达为：$$ (\vec{p} - \vec{a}) \cdot \vec{n} = 0 $$其中 $\vec{p}$ 是一个任意的在平面上的点。这个等式实际上是在描述：一个从 $\vec{a}$ 到 $\vec{p}$ 的向量是垂直于平面法线 $n$ 的。如果 $\vec{p}$ 不在该平面内，则该等式不成立。有时候我们需要找到一个包含点 $\vec{a}, \vec{b}, \vec{c}$ 的平面。该平面的法线可以用该平面内的任意两个向量的叉积给出：$$ \vec{n} = (\vec{b} - \vec{a})\times (\vec{c} - \vec{a}) $$利用上式，可以重写本节的第一个式子：$$ (\vec{p} - \vec{a}) \cdot ((\vec{b} - \vec{a}) \times (\vec{c} - \vec{a})) = 0 $$该式可以这么理解：由 $\vec{p} - \vec{a}$ , $\vec{b} - \vec{a}$ 和 $\vec{c} - \vec{a}$ 定义的平行管的体积为 $0$，即他们是共面的。一个 Full-Brown 的笛卡尔表示由行列式给出：$$ \begin{Vmatrix} x - x_a & y - y_a & z - z_a \\ x_b - x_a & y_b - y_a & z_b - z_a \\ x_c-x_a & y_c - y_a & z_c-z_a\end{Vmatrix} = 0 $$本质上，上两式是等价的。且两者都容易用来进行编程。3D Quadric Surfaces类似于二次多项式可以用来定义2D中的二次曲线，由 $x,y,z$ 组成的二次多项式可以用来在 3D 中定义二次平面。例如，一个球可以表示成：$$ f(\vec{p}) = (\vec{p} - \vec{c})^2 - r^2= 0 $$一个在固定在轴上的椭球可以如下表示：$$ f(\vec{p}) = \frac{(x-x_c)^2}{a^2} + \frac{(y-y_c)^2}{b^2} + \frac{(z-z_c)^2}{c^2} - 1 = 0 $$3D Curves from Implicit Surfaces根据3D Implicit Surface 的启发，3D implicit curve 是否可以用 $f(\vec{p}) = 0$ 来描述呢？答案是可以的。但是所有这些曲线都只是退化曲面 (Degenerate Surface)，在实践中很少有用。Degenerate Surface 就是会在一条线或者一个点上坍缩的一个平面。其实由定义可以联想到这一性质。一条 3D 曲线可以由两个 Implicit equations 的节点同时构造出来：$$ f(\vec{p}) = 0, g(\vec{p}) = 0 $$例如，一条 3D Curves 可以由它截的两个平面来表示。一种更简便的方法是用参数式来表示。2D Parametric Curves一个用参数来描述的曲线，使用单参数来控制的。这个参数可以被视为一种在曲线上连续的索引。这样的曲线可以由这种形式来表示：$$ \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} g(t) \\ h(t) \end{bmatrix} $$该式中，$(x,y)$ 是在曲线上的一个点。$t$ 是一个影响这条曲线的一个参数。对于一个给定的 $t$，一些点是由函数 $g$ 和 $h$ 来决定的。对于连续的 $g$ 和 $h$，$t$ 的微小变化就会体现在 $x,y$ 的微笑变化中。所以，当 $t$ 连续的变化的时候，$(x,y)$ 也连续的被勾勒出来。这是一种很好的特性，因为我们可以用参数 $t$ 来显式地构造在曲线上的点。通常，我们可以用向量的形式来写一个参数式的曲线：$$ \vec{p} = f(t) $$其中，$f$ 是一个 vector-valued 的函数， $f: \mathbb{R} \rightarrow \mathbb{R}^2$。2D Parameter Lines一条经过 $\vec{p_0} =(x_0, y_0)$ 和 $\vec{p_1} = (x_1, y_1)$ 的点可以写做：$$ \begin{bmatrix} x \\ y\end{bmatrix} = \begin{bmatrix} x_0 + t(x_1-x_0) \\ y_0 + t(y_1-y_0)\end{bmatrix} $$上式中， $x, y$ 给出的形式非常类似，我们可以用一个更简单的向量形式来表达。对于 $\vec{p} = (x,y)$:$$ \vec{p}(t) = \vec{p_0} + t(\vec{p_1 - \vec{p_0}}) $$另外一种只用一个点 $\vec{o}$ 和一个向量 $\vec{d}$ 的表达方式是：$$ \vec{p}(t) = \vec{o} + t(\vec{d}) $$当向量 $\vec{d}$ 的模长为单位长度时，这条线被称作 arc-length parameterized （弧长参数化）的。这指出，参数 $t$ 就是这条线上长度的。任何参数式的曲线都可以被弧长参数化。弧长参数化式显然是一种非常方便的形式。2D Parametric Curves圆心在 $(x_c, y_c)$ 半径为 $r$ 的圆有参数式：$$ \begin{bmatrix} x \\ y\end{bmatrix} = \begin{bmatrix} x_c+r\cos \phi \\ y_c + r \sin \phi \end{bmatrix} $$为了保证参数 $\phi$ 是一个独特的参数，对于每一个在曲线上的点，我们可以限制其定义域 $\phi \in [0,2\pi)$ 或者 $\phi \in (-\pi, \pi]$。一个轴在坐标轴上的椭圆可以用不同的尺寸的 $x,y$ 来构造参数等式来表达：$$ \begin{bmatrix} x \\ y\end{bmatrix} = \begin{bmatrix} x_c+a \cos \phi \\ y_c + b\sin\phi \end{bmatrix} $$3D Parametric Curves类似于 2D 的情况，3D Parametric Curves 可以表示为：$$ x = f(t), y = g(t), z=h(t) $$例如，一个围着 $z$ 轴的螺旋状曲线可以写作：$$ x = \cos t, y = \sin t, z = t $$同理，如果我们要控制曲线的起点和终点，函数 $f,g,h$ 定义在 $D \subset \mathbb{R}$ 。其向量形式可以写作：$$ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \vec{p(t)} $$3D Parametric Lines不多细说，跟 2D 情况类似。3D Parametric Surfaces参数化方法可以用来定义 3D 空间中的平面，类似于我们如何定义曲线。在 3D 中平面的形式是：$$ x = f(u,v), y = g(u,v), z = h(u,v) $$或者，向量形式是：$$ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \vec{p}(u,v) $$例如，一个在地球上的点可以用经度和纬度来描述。如果我们定义地球的原点就是地心的话，设 $r$ 是地球的半径，一个在原点球的坐标系就可以用来帮助我们表示 Parametric equations:$$ x = r \cos \phi \sin \theta, y = r \sin \phi \sin \theta, z = r\cos \theta $$我们也可以写成向量形式，但是这并不为这样特定的参数形式具备可行性。我们想要对于一组给定的 $(x,y,z)$ 寻找一对 $(\theta, \phi)$。如果我们假设 $\phi \in (-\pi, \pi]$，这可以很轻松的用 $\arctan2$ 函数(atan2函数)来实现：$$ \theta = \arccos(z / \sqrt{x^2 + y^2 + z^2}), \phi = \arctan2(y,x) $$结合 Implicit surfaces，函数 $f$ 的微分给出了该平面的法向量，同时 $\vec{p}$ 的微分也告诉了我们该平面的几何信息。考虑函数 $\vec{q}(t) = \vec{p}(t,v_0)$。这个函数定义了一个 Parametric curve ，通过变化 $u$ 在保持$v = v_0$ 不变的时候。这条曲线被称为在平面中的 Isoparametric curve (等参数曲线)。$\vec{q}$ 的微分给出了一个与曲线相切的向量。并且由于这条曲线在平面内，$\vec{q'}$ 也在平面内。因为这是通过变化 $\vec{p}$ 中的参数来得到的，所以 $\vec{q'}$ 是 $\vec{p}$ 关于 $u$ 的偏微分，我们记作 $\vec{p_u}$。类似的说法展示了偏微分 $\vec{p_u}$ 给出了等参数曲线的切线，对于常数 $u$。这也是平面的第二个相切向量。由上，$\vec{p}$ 的微分给出了平面上任意一点的两个相切向量。平面的法线可以通过这些向量的叉积得到：因为他们二者都与平面相切，他们的叉积则与他们正交。这样就是平面的法线。右手系给出了一种方法哪一个是前面，或者说是外面，对于某一个平面。我们将用向量方便地表示：$$ \vec{n} = \vec{p_u} \times \vec{p_v} $$该法向量指向平面外方向。Summary for Curves and Surfaces2D 中的 Implicit curves 和 3D 中的 Implicit surfaces 用一个 scalar-valued （一个标量来衡量）的二元或者三元函数来表示：$f: \mathbb{R}^2 \to \mathbb{R}$ 或者 $f: \mathbb{R}^3 \to \mathbb{R}$ ，并且包含所有满足函数值为 $0$ 的点：$$ S = \{ \vec{p} | f(\vec{p}) = 0 \} $$2D 或者 3D 中的参数化曲线使用 vector-valued （一个矢量来衡量）的单变量函数来衡量：$\vec{p}: D \subset \mathbb{R} \to \mathbb{R}^2$ 或者 $\vec{p}: D \subset \mathbb{R} \to \mathbb{R}^3$ ，并且曲线扫过所有地方随着 $t$ 在整个 $D$ 上变化：$$ S = \{ \vec{p}(t) | t \in D \} $$3D 中的参数化平面也是用 vector-valued 的二元函数来表示的：$\vec{p}: D \subset \mathbb{R^2} \to \mathbb{R^3}$，该平面包括所有点 $(u,v)$ 在定义域内：$$ S = \{\vec{p}(t)| (u,v) \in D \} $$对于 Implicit curves 和 Implicit surfaces，法向量由 $f$ 的微分给出（即梯度）。相切向量（对于一条曲线）或者一组相切向量（对于一个平面）可以用法线的微分来构造一组基底。对于参数化曲线和平面，$\vec{p}$ 的微分给出了相切向量（对于一条曲线）或者一组相切向量（对于一个平面），并且法向量可以通过构造一组基底从任何切线中得出。
3D Gaussian Splatting for Real-Time Radiance Field Rendering
简述近期 3D-Reconstruction 的无敌热点，纯拼手速。该文章提供了一种利用高斯分布控制椭球来重建空间中几何体的方法，区别于 Nerf 利用了神经网络，该方法可以视为是一种传统方法。优点在于精度高，速度快，可以做到 1080 30fps 的实时重建。缺点在于内存消耗较大（存储的 Gaussian Splatting 的信息较多）。此外，该文章还提供了一种基于 GPU 的基数排序，来提升光栅化速度的方法。 没有提供消融实验来说明速度的提升是否来源于此。参考3DGS