众所周知,数学中向量、矩阵(变换)、齐次坐标以及四元数的概念和规则是3D游戏编程和计算机图形学的理论基础。下面介绍开发过程中经常用到的一些数学公式。
- 直线公式
P(t) = (1-t)P1 + tP2
其中,P1和P2表示3D空间的两点向量。t可以是任意实数。P1与P2之间的线段对应于t在0到1之间的值。
- 点到直线的距离公式
- 射线公式
P(t) = P0 + tu
其中,t的值大于等于0,u表示射线方向向量。实际上,让t为任意实数,就得到三维空间直线。
- 平面公式
对应给定的3D点P0和法向量N,那么过P0且与N垂直可以唯一确定一个平面。
N.(P - P0) = 0
平面方程通常也可以表示为:
Ax + By + Cz + d = 0
其中,A,B,C是法向量N的x,y,z分量,即:
N.P+d = 0
法向量经常被规格化单位长度,因为这样等式
D = N.P +d
就可以表示平面到任意点P的带符号距离。如果D=0,则表示点P在平面上。如果d>0,则称点P在平面的正侧,因为此时P位于法向量所指的一侧。与些相反,如果d<0,那么P位于平面的负侧。
- 直线与平面相交公式
确定直线与平面的交点,是3D引擎中的一种常用计算。特别是在计算多边形裁剪的过程中会大量地用到直线与平面的求交。
设P(t)=Q+tV表示包含点Q并沿V方向延伸的直线。对于法向量为N并且距原点带符号距离为D的平面,可以通过解方程来确定直线与平面的交点。
N.P(t) + D = 0 //平面公式
推导过程就不写了,结果为
把t的值代回直线方程P(t)=Q+tV,就可以求得直线与平面的交点。如果N.V为0,那么直线与平面平行(平面法向量与直线方向向量V垂直)。这种情况下,如果N.Q+D=0,那么直线在平面上;否则,直线与平面没有交点。
- 三个平面相交公式
平面L1和平面L2的交线可以表示为P(t)=Q+tV。