ThreeJs源码分析1 - 基础数学类
ThreeJs源码分析1 - 基础数学类
数学部分作为计算机图形学必学的部分,本文章不讲具体实现,只介绍threejs中有哪些数学类,以及其中需要重点关注的地方。部分比较核心的代码在其他文章中专门分析。尤其是不同类型的图形求交的部分。
Vector类
Vector类中包括了Vector2、Vector3、Vector4,适合齐次、非齐次坐标系下的二维、三维的点、向量的表示和计算。
计算部分,包括了向量的加减、点乘、叉乘、标量的加减乘除等操作,以及和矩阵之间进行的运算。Vector2中只包含基础的数学运算,Vector3和Vector4中,还有与四元数Quaternion以及欧拉数Euler进行运算的接口。除此之外,部分函数专门用于相机,如project投影,用于将一个三维坐标点通过相机的参数投影到屏幕坐标。
Matrix类
Matrix类同样包括Matrix2、Matrix3、Matrix4矩阵,这些矩阵都是方阵,即行数与列数相同的矩阵。Threejs中没有非方阵的矩阵。
这些类中都包含了基础的矩阵操作接口,如矩阵的左乘、右乘、转置、求逆、求特征值、平移、旋转、缩放等,以及一些可以将自己创建为一些特殊矩阵的接口,如设置该矩阵为一个纯平移、旋转、缩放矩阵等。在Matrix4中则有与四元数和欧拉角交互的接口。
Quaternion类和Euler类
四元数和欧拉角都是用于表示物体旋转的量。其中欧拉角有三个参数,而四元数则有四个参数。两者适合不同的应用场景,具体使用哪一个,需要看具体的需求。
在Quaternion类中,主要实现了以下几种算法:
- 四元数球面线性插值SLERP
- 四元数的乘法
- 和欧拉角的转换
- 和旋转矩阵、按轴旋转的方式的相互转换
Euler角同样实现了和旋转矩阵、按轴旋转的方式的相互转换。
Box类
Box类即为轴对称包围盒类,包括二维的Box2和Box3类,表示的方法都为记录每个轴的最大最小范围值。
在box类中,实现了多种创建、扩展包围盒的方法,以及与点、包围盒、射线的求交算法。
轴对称包围盒没有太多难的地方,但是Threejs暂时还不支持OBB包围盒,如果要使用OBB,则需要自己手动实现。
Line3类
三维线类,通过线段的两个端点来定义。
内部支持的接口也有限,主要是求最近点、求线段t参数之类的方法。
Plane类
平面类的定义是通过平面的法向,以及远点到面的距离来实现的。其本质是点法式的面的定义。其中法线即为平面法线,点则是法线乘以距离,即为面上的一个点,且这个点是距离坐标系原点最近的一个点。
同时,还可以通过法线和共面点、三个共面点的方式来创建这个平面。
面实现的接口主要包括了以下几种:
- 和点、球之间的距离
- 将点投影到该面上
- 和线、包围盒、球的求交
- 共面点的创建
- 一般的变换
Sphere类
球体类构建很简单,球中心坐标加半径即可,也可以通过一系列的点创建这些点的最小包围球。球体内置的方法主要有与点、球、面的求交,以及自身几何体的变换。
Spherical类
Spherical是一个球面坐标系上的坐标,通过一个半径,以及两个旋转角度来表示。球面坐标系可以与笛卡尔坐标系转换。
SphericalHarmonics3类
Spherical Harmonics称为球谐函数,主要用于光照计算,编码光照信息。
此部分我不太懂,后续学习后出一章专题。
Triangle类
三角形类,内部构成就是三角形的三个点。
实现的方法有求三角形的法线、重心坐标、点距离、三角面上的点的插值参数、正反面计算、面积计算、中点、三角形所在平面、与包围盒求交等。
Cylindrical类
柱面坐标系。以柱底面半径,XZ平面的旋转角度和Y轴上的高度来定义。可以和笛卡尔坐标系转换。
Frustum类
视锥类。由六个平面构成,主要用于透视相机的相机视锥的构建,同时,内置了与不同几何体求交的方法。包括球体、点精灵、包围盒、点。与物体求交的算法实际上是与物体的外界包围球求交。
FrustumArray类
FrustumArray类主要与cameraArray一起使用,用于计算在多相机的条件下视锥元物体是否相交。
Interpolant类
插值类,提供参数化点位,以及采样值和采样大小,对数据进行插值计算。
在interpolants文件夹中,定义了多种插值方法
- CubicInterpolant:三次样条插值
- Discreteinterpolant:离散插值
- LinearInterpolant:线性插值
- QuaternionLinearInterpolant:球面线性插值
Ray类
射线类,比较重要的一个类
射线由一个起点和一个方向构成。主要方法有与点、线、面段求距离,以及与球、面、包围盒、三角形求交。threejs中射线求交所需要方法基本都由射线类完成。
Color类
内部定义了各种颜色,以及不同颜色表示之间的转换。
ColorManagement类
颜色管理类,同样是定义了一些内置颜色,以及颜色之间的转换函数,用作颜色计算的辅助。

浙公网安备 33010602011771号