更新版本,修复镜像槽问题

This commit is contained in:
FishOrBear
2020-04-30 17:12:30 +08:00
parent d79d759091
commit 85db279fab
12 changed files with 2582 additions and 2218 deletions

View File

@@ -1,16 +1,15 @@
import * as THREE from 'three';
import { Geometry, Vector, Vector2, Vector3, Box3 } from 'three';
import { Geometry, Vector, Vector2, Vector3, Box3, Matrix4, Object3D, Line, Mesh } from 'three';
import { Matrix2 } from './Matrix2';
export const cZeroVec = new THREE.Vector3();
export const cXAxis = new THREE.Vector3(1, 0, 0);
export const cYAxis = new THREE.Vector3(0, 1, 0);
export const cZAxis = new THREE.Vector3(0, 0, 1);
export const cZeroVec = new Vector3();
export const cXAxis = new Vector3(1, 0, 0);
export const cYAxis = new Vector3(0, 1, 0);
export const cZAxis = new Vector3(0, 0, 1);
/**
* 旋转一个点,旋转中心在原点
*
*
* @export
* @param {Vector3} pt 点
* @param {number} ang 角度.
@@ -26,6 +25,12 @@ export function equaln(v1: number, v2: number, fuzz = 1e-3)
{
return Math.abs(v1 - v2) < fuzz;
}
export function equalv3(v1: Vector3, v2: Vector3, fuzz = 1e-8)
{
return equaln(v1.x, v2.x, fuzz) && equaln(v1.y, v2.y, fuzz) && equaln(v1.z, v2.z, fuzz);
}
export function equal<T extends Vector>(v1: T, v2: T)
{
return v1.distanceToSquared(v2) < 1e-8;
@@ -50,13 +55,13 @@ export function fixAngle(an: number, fixAngle: number, fuzz: number = 0.1)
/**
* 按照极坐标的方式移动一个点
*
*
* @export
* @template
* @template
* @param {T} v 向量(2d,3d)
* @param {number} an 角度
* @param {number} dis 距离
* @returns {T}
* @returns {T}
*/
export function polar<T extends Vector2 | Vector3>(v: T, an: number, dis: number): T
{
@@ -76,22 +81,22 @@ export function angle(v: Vector3 | Vector2)
/**
* 求两个向量的夹角,顺时针为负,逆时针为正
*
* @param {THREE.Vector3} v1
* @param {THREE.Vector3} v2
* @param {THREE.Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
* @returns
*
* @param {Vector3} v1
* @param {Vector3} v2
* @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1
* @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)))
{
//任意轴坐标系. 使用相机的构造矩阵.
ref.multiplyScalar(-1);
let up = getLoocAtUpVec(ref);
let refOcs = new THREE.Matrix4();
let refOcs = new Matrix4();
refOcs.lookAt(cZeroVec, ref, up);
let refOcsInv = new THREE.Matrix4().getInverse(refOcs);
let refOcsInv = new Matrix4().getInverse(refOcs);
v1.applyMatrix4(refOcsInv);
v2.applyMatrix4(refOcsInv);
v1.z = 0;
@@ -103,7 +108,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;
}
export function getLoocAtUpVec(dir: THREE.Vector3): THREE.Vector3
export function getLoocAtUpVec(dir: Vector3): Vector3
{
if (dir.equals(cZeroVec))
{
@@ -112,37 +117,37 @@ export function getLoocAtUpVec(dir: THREE.Vector3): THREE.Vector3
let norm = dir.clone().normalize();
if (norm.equals(cZAxis))
{
return new THREE.Vector3(0, 1, 0);
return new Vector3(0, 1, 0);
}
else if (norm.equals(cZAxis.clone().negate()))
{
return new THREE.Vector3(0, -1, 0);
return new Vector3(0, -1, 0);
}
else
{
let xv: THREE.Vector3 = new THREE.Vector3();
let xv: Vector3 = new Vector3();
xv.crossVectors(cZAxis, norm);
let up = new THREE.Vector3();
let up = new Vector3();
up.crossVectors(norm, xv);
return up;
}
}
export function createLookAtMat4(dir: THREE.Vector3): THREE.Matrix4
export function createLookAtMat4(dir: Vector3): Matrix4
{
let up = getLoocAtUpVec(dir);
let mat = new THREE.Matrix4();
let mat = new Matrix4();
mat.lookAt(cZeroVec, dir, up);
return mat;
}
export function isParallelTo(v1: THREE.Vector3, v2: THREE.Vector3)
export function isParallelTo(v1: Vector3, v2: Vector3)
{
return v1.clone().cross(v2).lengthSq() < 1e-9;
}
export function ptToString(v: THREE.Vector3, fractionDigits: number = 3): string
export function ptToString(v: Vector3, fractionDigits: number = 3): string
{
return v.toArray().map(o =>
{
@@ -150,16 +155,16 @@ export function ptToString(v: THREE.Vector3, fractionDigits: number = 3): string
}).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);
}
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);
}
export function midPtCir(v1: THREE.Vector3, v2: THREE.Vector3)
export function midPtCir(v1: Vector3, v2: Vector3)
{
let baseline = new Vector3(1, 0, 0);
let outLine = v2.clone().sub(v1);
@@ -170,11 +175,11 @@ export function midPtCir(v1: THREE.Vector3, v2: THREE.Vector3)
/**
* 获得Three对象的包围盒.
* @param obj
* @param obj
* @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();
if (updateMatrix) obj.updateMatrixWorld(false);
@@ -199,7 +204,7 @@ export function GetBox(obj: THREE.Object3D, updateMatrix?: boolean): THREE.Box3
return box;
}
export function GetBoxArr(arr: Array<THREE.Object3D>): THREE.Box3
export function GetBoxArr(arr: Array<Object3D>): Box3
{
let box = new Box3();
for (let o of arr)
@@ -211,9 +216,9 @@ export function GetBoxArr(arr: Array<THREE.Object3D>): THREE.Box3
return box;
}
export function MoveMatrix(v: THREE.Vector3): THREE.Matrix4
export function MoveMatrix(v: Vector3): Matrix4
{
let mat = new THREE.Matrix4();
let mat = new Matrix4();
mat.makeTranslation(v.x, v.y, v.z);
return mat;
}
@@ -265,9 +270,9 @@ export function angleAndX(v: Vector3 | Vector2)
}
/**
* 将角度调整为0-2pi之间
*
*
* @export
* @param {number} an
* @param {number} an
*/
export function angleTo2Pi(an: number)
{
@@ -275,9 +280,9 @@ export function angleTo2Pi(an: number)
if (an < 0) an += Math.PI * 2
return an;
}
export function updateGeometry(l: THREE.Line | THREE.Mesh, geometry: Geometry)
export function updateGeometry(l: Line | Mesh, geometry: Geometry)
{
let geo = l.geometry as THREE.Geometry;
let geo = l.geometry as Geometry;
geo.dispose();
l.geometry = geometry;
geometry.verticesNeedUpdate = true;