计算两点之间的距离
function calculateDistance(pointA, pointB) {// 确保输入的参数是 THREE.Vector3 类型if (!(pointA instanceof THREE.Vector3) || !(pointB instanceof THREE.Vector3)) {throw new Error('参数必须是 THREE.Vector3 类型');}// 计算两点之间的距离return pointA.distanceTo(pointB);
}// 示例使用
const pointA = new THREE.Vector3(1, 2, 3);
const pointB = new THREE.Vector3(4, 5, 6);const distance = calculateDistance(pointA, pointB);
console.log('两点之间的距离:', distance);
获取相机视线方向
function getCameraDirection(camera) {// 确保输入的参数是 THREE.Camera 类型if (!(camera instanceof THREE.Camera)) {throw new Error('参数必须是 THREE.Camera 类型');}// 创建一个向量来存储相机的方向const direction = new THREE.Vector3();// 获取相机的视线方向camera.getWorldDirection(direction);return direction;
}// 示例使用
const direction = getCameraDirection(camera);
console.log('相机视线方向:', direction);
获取相机视线方向和目标点之间的夹角
function getCameraAngleToTarget(camera, target) {// 确保输入的参数是 THREE.Camera 和 THREE.Vector3 类型if (!(camera instanceof THREE.Camera)) {throw new Error('参数 camera 必须是 THREE.Camera 类型');}if (!(target instanceof THREE.Vector3)) {throw new Error('参数 target 必须是 THREE.Vector3 类型');}// 创建一个向量来存储相机的方向const cameraDirection = new THREE.Vector3();camera.getWorldDirection(cameraDirection); // 获取相机的视线方向// 计算从相机位置到目标点的方向向量const cameraPosition = camera.position.clone(); // 获取相机位置const targetDirection = target.clone().sub(cameraPosition).normalize(); // 目标方向// 计算相机视线方向和目标点方向的夹角const angle = cameraDirection.angleTo(targetDirection); // 返回的是弧度return angle; // 返回夹角
}// 示例使用
const target = new THREE.Vector3(10, 5, -3); // 假设目标点
const angle = getCameraAngleToTarget(camera, target);console.log('相机视线方向和目标点之间的夹角(弧度):', angle);
//如果需要将结果转换为角度,可以使用 THREE.MathUtils.radToDeg()
判断两个向量是否相等
function areVectorsEqual(vector1, vector2) {// 确保传入的是 Vector3 类型if (!(vector1 instanceof THREE.Vector3) || !(vector2 instanceof THREE.Vector3)) {throw new Error('参数必须是 THREE.Vector3 类型');}// 使用 equals() 方法判断两个向量是否相等return vector1.equals(vector2);
}// 示例使用
const vector1 = new THREE.Vector3(1, 2, 3);
const vector2 = new THREE.Vector3(1, 2, 3);
const vector3 = new THREE.Vector3(4, 5, 6);console.log('vector1 和 vector2 是否相等:', areVectorsEqual(vector1, vector2)); // true
console.log('vector1 和 vector3 是否相等:', areVectorsEqual(vector1, vector3)); // false
判断目标点是否在线段组成的折线上
function isPointOnPolyline(point, points, tolerance = 0.0001) {// 确保参数类型正确if (!(point instanceof THREE.Vector3) || !Array.isArray(points) || points.length < 2) {throw new Error('参数无效。point 必须是 THREE.Vector3,points 必须是包含至少两个 THREE.Vector3 对象的数组');}// 遍历折线的每一段(由连续两个点组成的线段)for (let i = 0; i < points.length - 1; i++) {const lineStart = points[i];const lineEnd = points[i + 1];// 计算线段向量和目标点与线段起点的向量const lineVec = lineEnd.clone().sub(lineStart); // 线段向量const pointVec = point.clone().sub(lineStart); // 目标点与线段起点的向量// 计算点与线段的投影,判断是否共线const crossProduct = new THREE.Vector3().crossVectors(lineVec, pointVec);if (crossProduct.length() <= tolerance) {// 计算点在线段上的投影,判断是否在线段范围内const dotProduct = pointVec.dot(lineVec);const lineLengthSq = lineVec.lengthSq();if (dotProduct >= 0 && dotProduct <= lineLengthSq) {return true; // 点在该线段上}}}return false; // 点不在任何一段线段上
}// 示例使用
const point = new THREE.Vector3(2, 2, 0);
const points = [new THREE.Vector3(1, 1, 0),new THREE.Vector3(3, 3, 0),new THREE.Vector3(5, 5, 0)
];const isOnPolyline = isPointOnPolyline(point, points);
console.log('目标点是否在折线上:', isOnPolyline);
计算目标点在线段上的投影点
function getProjectedPointOnLine(point, lineStart, lineEnd) {// 确保输入参数是 THREE.Vector3 类型if (!(point instanceof THREE.Vector3) || !(lineStart instanceof THREE.Vector3) || !(lineEnd instanceof THREE.Vector3)) {throw new Error('参数必须是 THREE.Vector3 类型');}// 计算线段向量const lineVec = lineEnd.clone().sub(lineStart);// 计算目标点相对于线段起点的向量const pointVec = point.clone().sub(lineStart);// 计算线段的单位向量const lineVecNormalized = lineVec.clone().normalize();// 计算点在线段上的投影长度(通过点积)const projectionLength = pointVec.dot(lineVecNormalized);// 投影点 = 线段起点 + 投影长度 * 线段的单位向量const projectedPoint = lineStart.clone().add(lineVecNormalized.multiplyScalar(projectionLength));return projectedPoint;
}// 示例使用
const point = new THREE.Vector3(4, 2, 0); // 目标点
const lineStart = new THREE.Vector3(1, 1, 0); // 线段起点
const lineEnd = new THREE.Vector3(5, 5, 0); // 线段终点const projectedPoint = getProjectedPointOnLine(point, lineStart, lineEnd);
console.log('投影点坐标:', projectedPoint);
持续记录~