You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
WebCAD/src/Common/Matrix4Utils.ts

81 lines
2.2 KiB

import { Matrix4, Vector3 } from 'three';
import { equaln, isParallelTo } from '../Geometry/GeUtils';
7 years ago
/**
*
*
* @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
* YZXAxisYAxisZAxis
*
* @export
* @returns {Matrix4}
*/
export function matrixAlignCoordSys(matrixFrom: Matrix4, matrixTo: Matrix4): Matrix4
{
let matrix = new Matrix4().getInverse(matrixTo);
return new Matrix4().multiplyMatrices(matrix, matrixFrom);
}
/**
* 2
*
* @export
* @param {Matrix4} matrixFrom
* @param {Matrix4} matrixTo
* @returns {boolean} 2
*/
export function matrixIsCoplane(matrixFrom: Matrix4, matrixTo: Matrix4): 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);
}
//构造缩放矩阵
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;
}