|
|
@ -1,7 +1,6 @@
|
|
|
|
import * as THREE from 'three';
|
|
|
|
import { Box3, BufferGeometry, Geometry, Matrix4, Object3D, Vector, Vector2, Vector3, Line, Mesh } from 'three';
|
|
|
|
import { Box3, BufferGeometry, Geometry, Matrix4, Vector, Vector2, Vector3, BufferAttribute } from 'three';
|
|
|
|
|
|
|
|
import { Matrix2 } from './Matrix2';
|
|
|
|
|
|
|
|
import { ToFixed } from '../Common/Utils';
|
|
|
|
import { ToFixed } from '../Common/Utils';
|
|
|
|
|
|
|
|
import { Matrix2 } from './Matrix2';
|
|
|
|
|
|
|
|
|
|
|
|
export const cZeroVec = new Vector3();
|
|
|
|
export const cZeroVec = new Vector3();
|
|
|
|
export const cXAxis = new Vector3(1, 0, 0);
|
|
|
|
export const cXAxis = new Vector3(1, 0, 0);
|
|
|
@ -35,15 +34,6 @@ export function equalv2(v1: Vector2, v2: Vector2, fuzz = 1e-8)
|
|
|
|
return equaln(v1.x, v2.x, fuzz) && equaln(v1.y, v2.y, fuzz);
|
|
|
|
return equaln(v1.x, v2.x, fuzz) && equaln(v1.y, v2.y, fuzz);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function less(v1, v2, fuzz = 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return v1 - v2 < fuzz;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
export function greater(v1, v2, fuzz = 0)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
return v1 - v2 > fuzz;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 按照极坐标的方式移动一个点
|
|
|
|
* 按照极坐标的方式移动一个点
|
|
|
|
*
|
|
|
|
*
|
|
|
@ -72,21 +62,21 @@ export function angle(v: Vector3 | Vector2)
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 求两个向量的夹角,顺时针为负,逆时针为正
|
|
|
|
* 求两个向量的夹角,顺时针为负,逆时针为正
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* @param {THREE.Vector3} v1
|
|
|
|
* @param {Vector3} v1
|
|
|
|
* @param {THREE.Vector3} v2
|
|
|
|
* @param {Vector3} v2
|
|
|
|
* @param {THREE.Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
|
|
|
|
* @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
|
|
|
|
* @returns
|
|
|
|
* @returns
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function angleTo(v1: THREE.Vector3, v2: THREE.Vector3, ref: THREE.Vector3 = new THREE.Vector3(0, 0, 1))
|
|
|
|
export function angleTo(v1: Vector3, v2: Vector3, ref: Vector3 = new Vector3(0, 0, 1))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (!ref.equals(new Vector3(0, 0, 1)))
|
|
|
|
if (!ref.equals(new Vector3(0, 0, 1)))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//任意轴坐标系. 使用相机的构造矩阵.
|
|
|
|
//任意轴坐标系. 使用相机的构造矩阵.
|
|
|
|
ref.multiplyScalar(-1);
|
|
|
|
ref.multiplyScalar(-1);
|
|
|
|
let up = getLoocAtUpVec(ref);
|
|
|
|
let up = getLoocAtUpVec(ref);
|
|
|
|
let refOcs = new THREE.Matrix4();
|
|
|
|
let refOcs = new Matrix4();
|
|
|
|
refOcs.lookAt(cZeroVec, ref, up);
|
|
|
|
refOcs.lookAt(cZeroVec, ref, up);
|
|
|
|
let refOcsInv = new THREE.Matrix4().getInverse(refOcs);
|
|
|
|
let refOcsInv = new Matrix4().getInverse(refOcs);
|
|
|
|
v1.applyMatrix4(refOcsInv);
|
|
|
|
v1.applyMatrix4(refOcsInv);
|
|
|
|
v2.applyMatrix4(refOcsInv);
|
|
|
|
v2.applyMatrix4(refOcsInv);
|
|
|
|
v1.z = 0;
|
|
|
|
v1.z = 0;
|
|
|
@ -98,7 +88,7 @@ export function angleTo(v1: THREE.Vector3, v2: THREE.Vector3, ref: THREE.Vector3
|
|
|
|
return cv.z === 0 ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z;
|
|
|
|
return cv.z === 0 ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function getLoocAtUpVec(dir: THREE.Vector3): THREE.Vector3
|
|
|
|
export function getLoocAtUpVec(dir: Vector3): Vector3
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (dir.equals(cZeroVec))
|
|
|
|
if (dir.equals(cZeroVec))
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -107,53 +97,49 @@ export function getLoocAtUpVec(dir: THREE.Vector3): THREE.Vector3
|
|
|
|
let norm = dir.clone().normalize();
|
|
|
|
let norm = dir.clone().normalize();
|
|
|
|
if (norm.equals(cZAxis))
|
|
|
|
if (norm.equals(cZAxis))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return new THREE.Vector3(0, 1, 0);
|
|
|
|
return new Vector3(0, 1, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (norm.equals(cZAxis.clone().negate()))
|
|
|
|
else if (norm.equals(cZAxis.clone().negate()))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return new THREE.Vector3(0, -1, 0);
|
|
|
|
return new Vector3(0, -1, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
else
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let xv: THREE.Vector3 = new THREE.Vector3();
|
|
|
|
let xv: Vector3 = new Vector3();
|
|
|
|
xv.crossVectors(cZAxis, norm);
|
|
|
|
xv.crossVectors(cZAxis, norm);
|
|
|
|
|
|
|
|
|
|
|
|
let up = new THREE.Vector3();
|
|
|
|
let up = new Vector3();
|
|
|
|
up.crossVectors(norm, xv);
|
|
|
|
up.crossVectors(norm, xv);
|
|
|
|
return up;
|
|
|
|
return up;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function createLookAtMat4(dir: THREE.Vector3): THREE.Matrix4
|
|
|
|
export function createLookAtMat4(dir: Vector3): Matrix4
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let up = getLoocAtUpVec(dir);
|
|
|
|
let up = getLoocAtUpVec(dir);
|
|
|
|
let mat = new THREE.Matrix4();
|
|
|
|
let mat = new Matrix4();
|
|
|
|
mat.lookAt(cZeroVec, dir, up);
|
|
|
|
mat.lookAt(cZeroVec, dir, up);
|
|
|
|
return mat;
|
|
|
|
return mat;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* 判断2个向量是不是平行.
|
|
|
|
* 判断2个向量是不是平行,尽量传入单位向量,才能保证计算精度
|
|
|
|
* @export
|
|
|
|
|
|
|
|
* @param {THREE.Vector3} v1
|
|
|
|
|
|
|
|
* @param {THREE.Vector3} v2
|
|
|
|
|
|
|
|
* @returns
|
|
|
|
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function isParallelTo(v1: THREE.Vector3, v2: THREE.Vector3): boolean
|
|
|
|
export function isParallelTo(v1: Vector3, v2: Vector3): boolean
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return v1.clone().cross(v2).lengthSq() < 1e-9;
|
|
|
|
return v1.clone().cross(v2).lengthSq() < 1e-8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function ptToString(v: THREE.Vector3, fractionDigits: number = 3): string
|
|
|
|
export function ptToString(v: Vector3, fractionDigits: number = 3): string
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return v.toArray().map(o => ToFixed(o, fractionDigits)).join(",");
|
|
|
|
return v.toArray().map(o => ToFixed(o, fractionDigits)).join(",");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function midPoint(v1: THREE.Vector3, v2: THREE.Vector3): THREE.Vector3
|
|
|
|
export function midPoint(v1: Vector3, v2: Vector3): Vector3
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return v1.clone().add(v2).multiplyScalar(0.5);
|
|
|
|
return v1.clone().add(v2).multiplyScalar(0.5);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export function midPoint2(v1: THREE.Vector2, v2: THREE.Vector2): THREE.Vector2
|
|
|
|
export function midPoint2(v1: Vector2, v2: Vector2): Vector2
|
|
|
|
{
|
|
|
|
{
|
|
|
|
return v1.clone().add(v2).multiplyScalar(0.5);
|
|
|
|
return v1.clone().add(v2).multiplyScalar(0.5);
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -164,7 +150,7 @@ export function midPoint2(v1: THREE.Vector2, v2: THREE.Vector2): THREE.Vector2
|
|
|
|
* @param [updateMatrix] 是否应该更新对象矩阵
|
|
|
|
* @param [updateMatrix] 是否应该更新对象矩阵
|
|
|
|
* @returns box
|
|
|
|
* @returns box
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
export function GetBox(obj: THREE.Object3D, updateMatrix?: boolean): THREE.Box3
|
|
|
|
export function GetBox(obj: Object3D, updateMatrix?: boolean): Box3
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let box = new Box3();
|
|
|
|
let box = new Box3();
|
|
|
|
if (updateMatrix) obj.updateMatrixWorld(false);
|
|
|
|
if (updateMatrix) obj.updateMatrixWorld(false);
|
|
|
@ -189,7 +175,7 @@ export function GetBox(obj: THREE.Object3D, updateMatrix?: boolean): THREE.Box3
|
|
|
|
return box;
|
|
|
|
return box;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
export function GetBoxArr(arr: Array<THREE.Object3D>): THREE.Box3
|
|
|
|
export function GetBoxArr(arr: Array<Object3D>): Box3
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let box = new Box3();
|
|
|
|
let box = new Box3();
|
|
|
|
for (let o of arr)
|
|
|
|
for (let o of arr)
|
|
|
@ -257,9 +243,9 @@ export function angleTo2Pi(an: number)
|
|
|
|
if (an < 0) an += Math.PI * 2
|
|
|
|
if (an < 0) an += Math.PI * 2
|
|
|
|
return an;
|
|
|
|
return an;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export function updateGeometry(l: THREE.Line | THREE.Mesh, geometry: Geometry | BufferGeometry)
|
|
|
|
export function updateGeometry(l: Line | Mesh, geometry: Geometry | BufferGeometry)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let geo = l.geometry as THREE.Geometry;
|
|
|
|
let geo = l.geometry as Geometry;
|
|
|
|
geo.dispose();
|
|
|
|
geo.dispose();
|
|
|
|
l.geometry = geometry;
|
|
|
|
l.geometry = geometry;
|
|
|
|
geometry.computeBoundingSphere();
|
|
|
|
geometry.computeBoundingSphere();
|
|
|
|