ThreeJs源码分析1 - 基础数学类

ThreeJs源码分析1 - 基础数学类

数学部分作为计算机图形学必学的部分,本文章不讲具体实现,只介绍threejs中有哪些数学类,以及其中需要重点关注的地方。部分比较核心的代码在其他文章中专门分析。尤其是不同类型的图形求交的部分。

Vector类

Vector类中包括了Vector2Vector3Vector4,适合齐次、非齐次坐标系下的二维、三维的点、向量的表示和计算。

计算部分,包括了向量的加减、点乘、叉乘、标量的加减乘除等操作,以及和矩阵之间进行的运算。Vector2中只包含基础的数学运算,Vector3Vector4中,还有与四元数Quaternion以及欧拉数Euler进行运算的接口。除此之外,部分函数专门用于相机,如project投影,用于将一个三维坐标点通过相机的参数投影到屏幕坐标。

Matrix类

Matrix类同样包括Matrix2Matrix3Matrix4矩阵,这些矩阵都是方阵,即行数与列数相同的矩阵。Threejs中没有非方阵的矩阵。

这些类中都包含了基础的矩阵操作接口,如矩阵的左乘、右乘、转置、求逆、求特征值、平移、旋转、缩放等,以及一些可以将自己创建为一些特殊矩阵的接口,如设置该矩阵为一个纯平移、旋转、缩放矩阵等。在Matrix4中则有与四元数和欧拉角交互的接口。

Quaternion类和Euler类

四元数和欧拉角都是用于表示物体旋转的量。其中欧拉角有三个参数,而四元数则有四个参数。两者适合不同的应用场景,具体使用哪一个,需要看具体的需求。

在Quaternion类中,主要实现了以下几种算法:

  • 四元数球面线性插值SLERP
  • 四元数的乘法
  • 和欧拉角的转换
  • 和旋转矩阵、按轴旋转的方式的相互转换

Euler角同样实现了和旋转矩阵、按轴旋转的方式的相互转换。

Box类

Box类即为轴对称包围盒类,包括二维的Box2Box3类,表示的方法都为记录每个轴的最大最小范围值。

在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类

颜色管理类,同样是定义了一些内置颜色,以及颜色之间的转换函数,用作颜色计算的辅助。

posted @ 2025-05-21 22:28  李煎饼_GISer  阅读(48)  评论(0)    收藏  举报