文章目录
前言
前面一些章节主要针对各种矩阵变换,模型变换、视图变换、投影变换、屏幕空间变换等等!这一节咱们补充一下多边形剪裁算法的内容,主要讲解一下为什么需要,以及介绍二、三维下三角形裁剪的基本思路。
正文
为什么需要多边形剪裁算法?
以三角形为例,经过了视图变换和投影变换后,咱们已经将三角形所有的顶点坐标转换成了裁剪空间的坐标,咱们得目标只是为了获得 [ − 1 , 1 ] 3 [-1,1]^3 [−1,1]3 包围盒内的顶点构成的三角形,但是必定有些三角形的顶点既有在立方体内部的,也有在外部的,这时候必定需要对其进行转化,从而变成内部的!
以二维举例:以下为三角形裁剪的示意图:

我们发现,其实二维下的三角形的顶点分支大致分为三类情况:
- (1)三角形的三个顶点都在可视坐标范围内。这种情况不需要裁剪
- (2)三角形的三个顶点既有可视坐标范围内,也有可视范围外。这种情况就是裁剪算法发挥的地方!
- (3)三角形的三个顶点都不在可视坐标范围内。这种情况不需要裁剪
我们发现上述的绿色三角形在可视范围内是一个类似楔形的四边形,这时候需要对其分割成两个三角形才行!其他更多情况,大家可自行画示意图理解即可!
前置知识
二维直线
直线方程:
二维空间下,直线方程一般有几种表达形式,如: y = k x + b , a x + b y − c = 0 y = kx+b, ax + by - c = 0 y=kx+b,ax+by−c=0 等等,但是为了工程方面的应用,可以用向量进行表达,如下:
a x + b y = d ( a b ) ⋅ ( x y ) = d \begin{align} ax +by &= d\\ \begin{pmatrix} a\\b \end{pmatrix} \cdot \begin{pmatrix} x\\y \end{pmatrix}&=d \end{align} ax+by(ab)⋅(xy)=d=d
记 n ⃗ = ( a b ) \vec{n} = \begin{pmatrix}a\\b\end{pmatrix} n=(ab) 且它为单位向量, p ⃗ = ( x y ) \vec{p}=\begin{pmatrix}x\\y\end{pmatrix} p=(xy),则带入上式可得: n ⃗ ⋅ p ⃗ = d \vec{n} \cdot \vec{p} = d n⋅p=d
上式表达的本质,可理解为:所有满足向 n ⃗ \vec{n} n 投影长度为d的点集合,示意图如下:

距离本质:
当d值变化时,表达的是沿着 n ⃗ \vec n n 方向滑动的变化情况,当 d > 0 d>0 d>0,往 n ⃗ \vec n n 指向的方向进行滑动,当 d < 0 d<0 d<0,往反方向滑动,当 d = = 0 d==0 d==0 时,则表达过原点的直线!如下图所示:

点和直线距离关系:
当我们将空间中任一点 p 0 = ( x 0 , y 0 ) p_0 = (x_0,y_0) p0=(x0,y0),带入上述方程,究竟代表什么含义呢?
其实我们得到的就是 p 0 p_0 p0 在 n ⃗ \vec n n 上的一个投影,具体如下:
n ⃗ ⋅ p ⃗ 0 − d > 0 ,则表示该点在直线的 n ⃗ 方向正侧 n ⃗ ⋅ p ⃗ 0 − d < 0 ,则表示该点在直线的 n ⃗ 方向反侧 n ⃗ ⋅ p ⃗ 0 − d = 0 ,则表示该点就在直线上 \vec n \cdot \vec p_0 - d > 0,则表示该点在直线的\vec n 方向正侧\\ \vec n \cdot \vec p_0 - d < 0,则表示该点在直线的\vec n 方向反侧\\ \vec n \cdot \vec p_0 - d = 0,则表示该点就在直线上\\ n⋅p0−d>0,则表示该点在直线的n方向正侧n⋅p0−d<


1万+

被折叠的 条评论
为什么被折叠?



