图形学的数学基础(十七):几何图元-球体圆形和平面

368 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

转载请注明出处.

图形学的数学基础(十七):几何图元-球体圆形和平面

球体和圆形

球体是一个三维对象,定义与给定点具有固定距离的所有点的集合。从球体中心到点的距离称为球体半径(RadiusRadius),球体的直接表示方式是描述其中心c\textbf{c}和半径rr

球体的隐式表述

pc=r||\textbf{p} - \textbf{c}|| = r

(xxc)2+(yyc)2+(zzc)2=r2(x-x_c)^2 + (y-y_c)^2 + (z-z_c)^2 = r^2

重要属性

  • 直径 D=2rD = 2r
  • 圆周长 C=2πrC = 2\pi{r}
  • 圆面积 A=πr2A = \pi{r^2}
  • 球体表面积 S=4πr2S = 4\pi{r^2}
  • 球体体积 S=43πr3S = \dfrac{4}{3}\pi{r^3}

圆面积对r的导数是圆周长,球体的体积对r的导数是其表面积。

平面(PlanePlane)

平面是三维的扁平的二维子空间。平面的定义类似于二维中直线的定义。定义中的种种相似性暗示了三维中的平面与二维中的无限直线有许多共同属性的事实。

平面方程

3D空间的平面方程是由一个法线n\vec{n}(normal  vectornormal\;vector)和平面上的一个点p1p_1来定义的。

1.jpg

由于n^\hat{n}与平面垂直,所以从平面上任意一点P\textbf{P}P1\textbf{P}_1所形成的矢量PP1\vec{P} - \vec{P_1}必然与n^\hat{n}垂直。

PP1=(xx1,yy1,zz1)\vec{P} - \vec{P_1} = (x-x_1,y-y_1,z-z_1)

n^(PP1)=0\hat{n}\cdot(\vec{P} - \vec{P_1}) = 0

[abc][xx1yy1zz1]=0\begin{bmatrix} a\\ b\\ c\\ \end{bmatrix}\cdot\begin{bmatrix}x-x_1\\ y-y_1\\ z-z_1\\ \end{bmatrix} = 0

a(xx1)+b(yy1)+c(zz1)=0a(x-x_1) + b(y-y_1) + c(z-z_1) = 0

ax+by+cz(ax1+by1+cz1)=0ax + by + cz -(ax_1 + by_1 + cz_1) = 0

假设常量项(ax1+by1+cz1)=d-(ax_1 + by_1 + cz_1) = d,则:

ax+by+cz+d=0ax+by+cz+d = 0

平面方程的几何解释

pn^=d\textbf{p}\cdot\hat{n} = d

由矢量点积的几何意义可知,上式说明了矢量p\vec{p}n^\hat{n}的投影长度都为固定长度d。

矢量n\vec{n}称为平面法线(NormalNormal),因为它与平面垂直,法线决定了平面的方向性,d则定义了从原点到平面的有符号垂直距离(跟直线的定义很相似,只不过拓展到了三维空间),增加d将使平面朝法线方向滑动,如果 d > 0,则原点位于平面的背面,如果d < 0则原点位于正面。

我们通常认为平面具有正面和背面,平面的正面就是n^\hat{n}所指的方向。

2.jpg

三个点定义平面

定义平面的另一种方式是给出位于平面的三个非共线点。三个共线的点无法定义平面,因为会有无数个包含该直线的平面,并且无法确定我们指的是其中哪一个。

假设三个非共线点p1,p2,p3\textbf{p}_1,\textbf{p}_2,\textbf{p}_3,要确定一个平面,必须求出n^d\hat{n}和d,首先必须计算n^\hat{n}n^\hat{n}会朝哪个方向呢?在左手系中执行此操作的标准方法是假设从平面的正面观察时,p1,p2,p3\textbf{p}_1,\textbf{p}_2,\textbf{p}_3按顺时针方向列出(右手系为逆时针方向):

3.jpg

注:按照右手系方式定义

按照逆时针方向构造两个矢量e1e2\vec{e_1}和\vec{e_2},n^\hat{n}p1,p2,p3\textbf{p}_1,\textbf{p}_2,\textbf{p}_3构造的平面垂直,那么必然也与e1e2\vec{e_1}和\vec{e_2}垂直。因此自然可以想到矢量叉积.

e3=p2p1\vec{e_3} = \textbf{p}_2 - \textbf{p}_1

e1=p3p2\vec{e_1} = \textbf{p}_3 - \textbf{p}_2

n^=e3×e1e3×e1\hat{n} = \dfrac{\vec{e_3}\times\vec{e_1}}{||\vec{e_3}\times\vec{e_1}||}

计算出了n^\hat{n},剩下的就是计算dd,取p1,p2,p3\textbf{p}_1,\textbf{p}_2,\textbf{p}_3中任意一点,和n^\hat{n}做点积即可。

完整计算过程如下:

e3=p2p1\vec{e_3} = \textbf{p}_2 - \textbf{p}_1

e1=p3p2\vec{e_1} = \textbf{p}_3 - \textbf{p}_2

n^=e3×e1e3×e1\hat{n} = \dfrac{\vec{e_3}\times\vec{e_1}}{||\vec{e_3}\times\vec{e_1}||}

d=p1n^=p1(p2p1)×(p3p1)(p2p1)×(p3p1)d = \vec{p_1}\cdot\hat{n} = \vec{p_1}\dfrac{(\textbf{p}_2 - \textbf{p}_1)\times(\textbf{p}_3 - \textbf{p}_1)}{||(\textbf{p}_2 - \textbf{p}_1)\times(\textbf{p}_3 - \textbf{p}_1)||}

参考

《3D数学基础》图形和游戏开发(第二版)

GAMES101 -现代计算机图形学入门-闫令琪

songho-openGL