BufferGeometry
Object3D
Raycaster
Camera
CubeCamera
PerspectiveCamera
OrthographicCamera
StereoCamera
Clock
Curve
CurvePath
Path
Shape
ShapePath
ArrowHelper
AxesHelper
BoxHelper
Box3Helper
CameraHelper
DirectionalLightHelper
GridHelper
PolarGridHelper
HemisphereLightHelper
PlaneHelper
PointLightHelper
SkeletonHelper
SpotLightHelper
Light
PointLight
RectAreaLight
SpotLight
DirectionalLight
HemisphereLight
LightShadow
PointLightShadow
AnimationLoader
AudioLoader
BufferGeometryLoader
CompressedTextureLoader
CubeTextureLoader
DataTextureLoader
FileLoader
ImageBitmapLoader
ImageLoader
Loader
LoaderUtils
MaterialLoader
ObjectLoader
TextureLoader
LoadingManager
Material
Box2
Box3
Color
Cylindrical
Euler
Frustum
Interpolant
Line3
MathUtils
Matrix3
Matrix4
Plane
Quaternion
AnimationAction
AnimationClip
AnimationMixer
AnimationObjectGroup
AnimationUtils
keyframeTrack
PropertyBinding
PropertyMixer
BooleanKeyframeTrack
QuaternionKeyframeTrack
StringKeyframeTrack
Audio
AudioAnalyser
AudioContext
AudioListener
PositionalAudio

Plane.distanceToPoint()

Plane.distanceToPoint() 方法用于计算平面和指定点之间的距离。此方法使用向量点积的几何知识进行计算。

语法

distanceToPoint(point: Vector3): number

参数

  • point — 指定的三维向量表示点的位置。

返回值

  • 返回平面和指定点之间的距离。单位为三维空间坐标系统中的距离单位(通常为毫米)。

示例

const plane = new THREE.Plane(new THREE.Vector3(0, 1, 0), 0); // 创建一个在 y=0 的平面

const point1 = new THREE.Vector3(0, 5, 0);
const point2 = new THREE.Vector3(0, -3, 0);

const distance1 = plane.distanceToPoint(point1); // 5
const distance2 = plane.distanceToPoint(point2); // -3

console.log(distance1);
console.log(distance2);

实现原理

Plane.distanceToPoint() 方法的实现依赖于向量点积及平面方程式。在向量的知识中,向量点积是两个向量的长度乘积与它们之间夹角的余弦值的乘积。在三维空间中,平面可以使用一个三维向量来表示(也称为平面法向量),并且可以使用该向量与平面上的点来表示平面上的所有点。平面上的所有点满足平面方程 $ax+by+cz+d=0$ ,因此可以通过其中一个点,如 $P$ 更新平面的方程式,并通过法向量求出 $d$ 的值。

现在,我们可以将要计算的点 $Q$ 表示为向量 $\vec{Q}$,其到平面的距离可以表示为:

$$ \operatorname{distance}(\vec{Q}, \text { plane })=\frac{\left|\operatorname{dot}(\vec{Q}, \vec{n})+d\right|}{\left|\vec{n}\right|} $$

其中,$\vec{n}$ 为平面的法向量,$d$ 为平面方程中的常量项。

代码实现

Plane.distanceToPoint() 方法的实现中,使用 Vector3.dot() 方法计算点和法向量之间的点积,然后将其添加到平面方程式中的常量项中。最后,通过法向量的长度将其标准化,并将距离除以其长度以获得最终距离值。

distanceToPoint(point) {
    const distance = point.dot(this.normal) + this.constant;
    const normalLength = this.normal.length();
    return Math.abs(distance) / normalLength;
}

参考资料