import { Matrix4, Vector3 } from 'three'; import { equaln, isParallelTo } from '../Geometry/GeUtils'; import { CoordinateSystem } from '../Geometry/CoordinateSystem'; /** * 设置矩阵的某列的向量 * * @export * @param {Matrix4} mat 矩阵 * @param {number} col 列索引,0x 1y 2z 3org * @param {Vector3} v 向量或点 */ export function matrixSetVector(mat: Matrix4, col: number, v: Vector3) { let index = col * 4; mat.elements[index] = v.x; mat.elements[index + 1] = v.y; mat.elements[index + 2] = v.z; } /** * * 返回矩阵,该坐标系将坐标系与原点的坐标系映射为坐标系, * 并将坐标系与X轴坐标系, * Y轴坐标轴以及Z轴坐标系统之间的坐标系统坐标系统的原点坐标系和原点坐标系统坐标轴的坐标系分别设置为XAxis,YAxis和ZAxis * * @export * @returns {Matrix4} 返回新的矩阵 */ export function matrixAlignCoordSys(matrixFrom: Matrix4, matrixTo: Matrix4): Matrix4 { return new Matrix4().getInverse(matrixTo).multiply(matrixFrom); } /** * 判断2个矩形共面 * * @export * @param {Matrix4} matrixFrom * @param {Matrix4} matrixTo * @returns {boolean} 2个矩阵共面 */ export function matrixIsCoplane(matrixFrom: Matrix4, matrixTo: Matrix4, fuzz = 1e-5): boolean { let nor1 = new Vector3().setFromMatrixColumn(matrixFrom, 2); let nor2 = new Vector3().setFromMatrixColumn(matrixTo, 2); //法线共面 if (!isParallelTo(nor1, nor2)) return false; //高共面 let pt = new Vector3().setFromMatrixPosition(matrixTo); //变换到自身对象坐标系. pt.applyMatrix4(new Matrix4().getInverse(matrixFrom)); return equaln(pt.z, 0, fuzz); } //构造缩放矩阵 export function matrixScale(scale: number, center?: Vector3) { let scaleMat = new Matrix4().makeScale(scale, scale, scale); if (center) scaleMat.setPosition(center.clone().multiplyScalar(1 - scale)); return scaleMat; } /** * 设置Mat的旋转矩阵 * @export */ export function setRotationOnAxis(mat: Matrix4, axis: Vector3, ro: number) { let pos = new Vector3().setFromMatrixPosition(mat); mat.makeRotationAxis(axis, ro); mat.setPosition(pos); return mat; } /** * 修正镜像后矩阵 * @param m */ export function reviseMirrorMatrix(m: Matrix4) { let cs = new CoordinateSystem().applyMatrix4(m); cs.m_yAxis.negate(); m.copy(cs.getMatrix4()); }