更新版本,修复镜像槽问题
This commit is contained in:
parent
d79d759091
commit
85db279fab
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,2 +1,3 @@
|
||||
/node_modules
|
||||
/dist
|
||||
/package-lock.json
|
||||
.history
|
||||
|
4466
package-lock.json
generated
4466
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
44
package.json
44
package.json
@ -6,10 +6,10 @@
|
||||
"types": "dist/index.d.ts",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"t": "tsc --noEmit -w",
|
||||
"build": "tsc",
|
||||
"umd": "webpack --config ./config/webpack.umd.ts",
|
||||
"dev": "webpack-dev-server --config ./config/webpack.view.ts",
|
||||
"type": "ts-node ./utils/copy_type.ts"
|
||||
"dev": "webpack-dev-server --config ./config/webpack.view.ts"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@ -18,29 +18,29 @@
|
||||
"author": "cx",
|
||||
"license": "ISC",
|
||||
"devDependencies": {
|
||||
"@types/hard-source-webpack-plugin": "^0.9.0",
|
||||
"@types/node": "^10.11.7",
|
||||
"@types/three": "^0.92.25",
|
||||
"@types/hard-source-webpack-plugin": "^1.0.1",
|
||||
"@types/node": "^13.13.4",
|
||||
"@types/three": "^0.103.2",
|
||||
"@types/uglifyjs-webpack-plugin": "^1.1.0",
|
||||
"@types/webpack": "^4.4.16",
|
||||
"@types/webpack-dev-server": "^3.1.1",
|
||||
"@types/webpack-env": "^1.13.6",
|
||||
"@types/webpack-merge": "^4.1.3",
|
||||
"@types/webpack": "^4.41.12",
|
||||
"@types/webpack-dev-server": "^3.10.1",
|
||||
"@types/webpack-env": "^1.15.2",
|
||||
"@types/webpack-merge": "^4.1.5",
|
||||
"awesome-typescript-loader": "^5.2.1",
|
||||
"fork-ts-checker-webpack-plugin": "^0.4.8",
|
||||
"hard-source-webpack-plugin": "^0.12.0",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"ts-loader": "^5.2.1",
|
||||
"ts-node": "^7.0.1",
|
||||
"typescript": "^3.1.3",
|
||||
"uglifyjs-webpack-plugin": "^2.0.1",
|
||||
"webpack": "^4.20.2",
|
||||
"webpack-cli": "^3.1.2",
|
||||
"webpack-dev-server": "^3.1.9",
|
||||
"webpack-merge": "^4.1.4"
|
||||
"fork-ts-checker-webpack-plugin": "^4.1.3",
|
||||
"hard-source-webpack-plugin": "^0.13.1",
|
||||
"html-webpack-plugin": "^4.2.1",
|
||||
"ts-loader": "^7.0.2",
|
||||
"ts-node": "^8.9.1",
|
||||
"typescript": "^3.8.3",
|
||||
"uglifyjs-webpack-plugin": "^2.2.0",
|
||||
"webpack": "^4.43.0",
|
||||
"webpack-cli": "^3.3.11",
|
||||
"webpack-dev-server": "^3.10.3",
|
||||
"webpack-merge": "^4.2.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"three": "^0.95.0",
|
||||
"wolfy87-eventemitter": "^5.2.5"
|
||||
"three": "^0.115.0",
|
||||
"wolfy87-eventemitter": "^5.2.9"
|
||||
}
|
||||
}
|
||||
|
@ -1,21 +1,20 @@
|
||||
import * as THREE from 'three';
|
||||
import { Vector3 } from 'three';
|
||||
import { Box3, Camera, MathUtils, OrthographicCamera, PerspectiveCamera, Vector3 } from 'three';
|
||||
import { Orbit } from './Orbit';
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* 相机的控制.
|
||||
* ->切换相机
|
||||
* ->设置视口大小
|
||||
* ->旋转和移动相机.
|
||||
*
|
||||
*
|
||||
* @export
|
||||
* @class ViewCameraManage
|
||||
*/
|
||||
export class CameraUpdate
|
||||
{
|
||||
private m_CurCamera: THREE.Camera;
|
||||
private m_CameraArray: Map<any, THREE.Camera> = new Map<any, THREE.Camera>();
|
||||
private m_CurCamera: Camera;
|
||||
private m_CameraArray: Map<any, Camera> = new Map<any, Camera>();
|
||||
|
||||
//视口的画布大小
|
||||
private m_Width: number;
|
||||
@ -24,9 +23,9 @@ export class CameraUpdate
|
||||
private m_ViewHeight: number = 10;
|
||||
|
||||
//观察的位置
|
||||
private m_Target: THREE.Vector3 = new THREE.Vector3();
|
||||
private m_Target: Vector3 = new Vector3();
|
||||
//观察向量
|
||||
private m_Direction: THREE.Vector3 = new THREE.Vector3(0, 0, -1);
|
||||
private m_Direction: Vector3 = new Vector3(0, 0, -1);
|
||||
//观察的轨道.
|
||||
private m_Orbit: Orbit = new Orbit();
|
||||
|
||||
@ -35,12 +34,12 @@ export class CameraUpdate
|
||||
|
||||
constructor()
|
||||
{
|
||||
this.m_CameraArray.set(THREE.OrthographicCamera, new THREE.OrthographicCamera(-2, 2, 2, -2,
|
||||
this.m_CameraArray.set(OrthographicCamera, new OrthographicCamera(-2, 2, 2, -2,
|
||||
-1e6, 1e6));
|
||||
|
||||
this.m_CameraArray.set(THREE.PerspectiveCamera, new THREE.PerspectiveCamera(50, 1, 0.01, 10000));
|
||||
this.m_CameraArray.set(PerspectiveCamera, new PerspectiveCamera(50, 1, 0.01, 10000));
|
||||
|
||||
this.m_CurCamera = this.m_CameraArray.get(THREE.OrthographicCamera);
|
||||
this.m_CurCamera = this.m_CameraArray.get(OrthographicCamera);
|
||||
|
||||
this.m_Orbit.UpdateRoValue(this.m_Direction);
|
||||
|
||||
@ -53,7 +52,7 @@ export class CameraUpdate
|
||||
return this.m_Width / this.m_Height;
|
||||
}
|
||||
|
||||
get Camera(): THREE.Camera
|
||||
get Camera(): Camera
|
||||
{
|
||||
return this.m_CurCamera;
|
||||
}
|
||||
@ -63,7 +62,7 @@ export class CameraUpdate
|
||||
}
|
||||
set ViewHeight(height)
|
||||
{
|
||||
this.m_ViewHeight = THREE.Math.clamp(height, this.m_MinViewHeight, this.m_MaxViewHeight);
|
||||
this.m_ViewHeight = MathUtils.clamp(height, this.m_MinViewHeight, this.m_MaxViewHeight);
|
||||
}
|
||||
|
||||
SetSize(width: number, height: number)
|
||||
@ -74,11 +73,11 @@ export class CameraUpdate
|
||||
|
||||
/**
|
||||
* 平移相机.
|
||||
*
|
||||
* @param {THREE.Vector3} mouseMove
|
||||
*
|
||||
* @param {Vector3} mouseMove
|
||||
* @memberof CameraControl
|
||||
*/
|
||||
Pan(mouseMove: THREE.Vector3)
|
||||
Pan(mouseMove: Vector3)
|
||||
{
|
||||
mouseMove.y *= -1;
|
||||
mouseMove.multiplyScalar(-this.m_ViewHeight / this.m_Height);
|
||||
@ -86,7 +85,7 @@ export class CameraUpdate
|
||||
this.m_Target.add(mouseMove);
|
||||
this.Update();
|
||||
}
|
||||
Rotate(mouseMove: THREE.Vector3, target: THREE.Vector3)
|
||||
Rotate(mouseMove: Vector3, target: Vector3)
|
||||
{
|
||||
this.m_Orbit.RoX -= mouseMove.y * 0.003;
|
||||
this.m_Orbit.RoZ -= mouseMove.x * 0.003;
|
||||
@ -112,9 +111,9 @@ export class CameraUpdate
|
||||
|
||||
this.Update();
|
||||
}
|
||||
Zoom(scale: number, scaleCenter?: THREE.Vector3)
|
||||
Zoom(scale: number, scaleCenter?: Vector3)
|
||||
{
|
||||
if (this.Camera instanceof THREE.OrthographicCamera)
|
||||
if (this.Camera instanceof OrthographicCamera)
|
||||
{
|
||||
this.ViewHeight *= scale;
|
||||
if (scaleCenter && this.m_ViewHeight < this.m_MaxViewHeight)
|
||||
@ -124,7 +123,7 @@ export class CameraUpdate
|
||||
this.m_Target.add(scaleCenter);
|
||||
}
|
||||
}
|
||||
else if (this.Camera instanceof THREE.PerspectiveCamera)
|
||||
else if (this.Camera instanceof PerspectiveCamera)
|
||||
{
|
||||
let add = scale > 1 ? 1 : -1;
|
||||
add *= this.Camera.position.distanceTo(this.m_Target) / 10;
|
||||
@ -132,7 +131,7 @@ export class CameraUpdate
|
||||
}
|
||||
this.Update();
|
||||
}
|
||||
ZoomExtensBox3(box3: THREE.Box3)
|
||||
ZoomExtensBox3(box3: Box3)
|
||||
{
|
||||
if (!box3 || box3.isEmpty()) return;
|
||||
this.Camera.updateMatrixWorld(false);
|
||||
@ -159,7 +158,7 @@ export class CameraUpdate
|
||||
}
|
||||
this.Update();
|
||||
}
|
||||
LookAt(dir: THREE.Vector3)
|
||||
LookAt(dir: Vector3)
|
||||
{
|
||||
this.m_Orbit.UpdateRoValue(dir);
|
||||
this.m_Direction.copy(dir);
|
||||
@ -173,15 +172,15 @@ export class CameraUpdate
|
||||
}
|
||||
/**
|
||||
* 根据视口大小,设置相机视口范围.
|
||||
*
|
||||
* @returns
|
||||
*
|
||||
* @returns
|
||||
* @memberof CameraControl
|
||||
*/
|
||||
Update()
|
||||
{
|
||||
this.Camera.position.copy(this.m_Target);
|
||||
|
||||
if (this.Camera instanceof THREE.OrthographicCamera)
|
||||
if (this.Camera instanceof OrthographicCamera)
|
||||
{
|
||||
this.Camera.left = this.Aspect * this.m_ViewHeight / -2;
|
||||
this.Camera.right = this.Aspect * this.m_ViewHeight / 2;
|
||||
@ -190,10 +189,10 @@ export class CameraUpdate
|
||||
|
||||
this.Camera.position.sub(this.m_Direction);
|
||||
}
|
||||
else if (this.Camera instanceof THREE.PerspectiveCamera)
|
||||
else if (this.Camera instanceof PerspectiveCamera)
|
||||
{
|
||||
this.Camera.aspect = this.Aspect;
|
||||
let distens = (this.m_ViewHeight / 2) / (Math.tan(THREE.Math.degToRad(this.Camera.fov) / 2));
|
||||
let distens = (this.m_ViewHeight / 2) / (Math.tan(MathUtils.degToRad(this.Camera.fov) / 2));
|
||||
|
||||
this.Camera.position.sub(this.m_Direction.clone().multiplyScalar(distens));
|
||||
}
|
||||
@ -209,13 +208,13 @@ export class CameraUpdate
|
||||
|
||||
SwitchCamera()
|
||||
{
|
||||
if (this.Camera instanceof THREE.OrthographicCamera)
|
||||
if (this.Camera instanceof OrthographicCamera)
|
||||
{
|
||||
this.m_CurCamera = this.m_CameraArray.get(THREE.PerspectiveCamera);
|
||||
this.m_CurCamera = this.m_CameraArray.get(PerspectiveCamera);
|
||||
}
|
||||
else
|
||||
{
|
||||
this.m_CurCamera = this.m_CameraArray.get(THREE.OrthographicCamera);
|
||||
this.m_CurCamera = this.m_CameraArray.get(OrthographicCamera);
|
||||
}
|
||||
this.UpdateUp();
|
||||
this.Update();
|
||||
|
@ -5,7 +5,6 @@ import { MoveMatrix } from "./GeUtils";
|
||||
|
||||
/**
|
||||
* 标注实体
|
||||
*
|
||||
* @export
|
||||
* @class Dimension
|
||||
* @extends {Group}
|
||||
@ -42,12 +41,12 @@ export class Dimension extends Group
|
||||
if (mirror)
|
||||
{
|
||||
let roMat = new Matrix4().makeRotationZ(Math.PI);
|
||||
text.applyMatrix(roMat);
|
||||
text.applyMatrix(MoveMatrix(new Vector3(length * 0.5, footLength - textHeight * 0.1)));
|
||||
text.applyMatrix4(roMat);
|
||||
text.applyMatrix4(MoveMatrix(new Vector3(length * 0.5, footLength - textHeight * 0.1)));
|
||||
}
|
||||
else
|
||||
{
|
||||
text.applyMatrix(MoveMatrix(new Vector3(length * 0.5, footLength * 1.1)));
|
||||
text.applyMatrix4(MoveMatrix(new Vector3(length * 0.5, footLength * 1.1)));
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,12 +1,12 @@
|
||||
import { Box3, Vector3, Matrix4, Mesh } from "three";
|
||||
import { Box3, Matrix4, Mesh, Vector3 } from "three";
|
||||
import { Dimension, GetBoxArr } from ".";
|
||||
|
||||
|
||||
/**
|
||||
* 绘制标注实体
|
||||
*
|
||||
*
|
||||
* @export
|
||||
* @param {Box3} box
|
||||
* @param {Box3} box
|
||||
* @returns 标注实体列表
|
||||
*/
|
||||
export function DrawDimension(brList: Mesh[]): Dimension[]
|
||||
@ -24,7 +24,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
|
||||
|
||||
let textHeight = 45;
|
||||
let dimx = new Dimension(size.x, textHeight, true);
|
||||
dimx.applyMatrix(mat4);
|
||||
dimx.applyMatrix4(mat4);
|
||||
|
||||
let dimz = new Dimension(size.z, textHeight);
|
||||
mat4.makeBasis(
|
||||
@ -33,7 +33,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
|
||||
new Vector3(0, -1, 0)
|
||||
)
|
||||
mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y)));
|
||||
dimz.applyMatrix(mat4);
|
||||
dimz.applyMatrix4(mat4);
|
||||
|
||||
let dimy = new Dimension(size.y, textHeight, true, true);
|
||||
mat4.makeBasis(
|
||||
@ -42,7 +42,7 @@ export function DrawDimension(brList: Mesh[]): Dimension[]
|
||||
new Vector3(0, 0, 1)
|
||||
)
|
||||
mat4.setPosition(box.max.clone().add(new Vector3(30, -size.y)));
|
||||
dimy.applyMatrix(mat4);
|
||||
dimy.applyMatrix4(mat4);
|
||||
|
||||
|
||||
return [dimx, dimy, dimz];
|
||||
|
@ -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;
|
||||
|
44
src/Orbit.ts
44
src/Orbit.ts
@ -1,9 +1,9 @@
|
||||
import * as THREE from "three";
|
||||
import { MathUtils, Vector3 } from "three";
|
||||
|
||||
/**
|
||||
* 轨道控制的数学类,观察向量和角度的互相转换
|
||||
* 当x当抬头或者低头到90度时,触发万向锁.
|
||||
*
|
||||
*
|
||||
* @class Orbit
|
||||
*/
|
||||
export class Orbit
|
||||
@ -20,19 +20,19 @@ export class Orbit
|
||||
}
|
||||
set RoX(v)
|
||||
{
|
||||
this.m_RoX = THREE.Math.clamp(v, Math.PI * -0.5, Math.PI * 0.5);
|
||||
this.m_RoX = MathUtils.clamp(v, Math.PI * -0.5, Math.PI * 0.5);
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用旋转角度 计算观察向量
|
||||
*
|
||||
* @param {THREE.Vector3} [dir] 引用传入,如果传入,那么就不构造新的向量
|
||||
* @returns {THREE.Vector3} 返回观察向量
|
||||
*
|
||||
* @param {Vector3} [dir] 引用传入,如果传入,那么就不构造新的向量
|
||||
* @returns {Vector3} 返回观察向量
|
||||
* @memberof Orbit
|
||||
*/
|
||||
UpdateDirection(dir?: THREE.Vector3): THREE.Vector3
|
||||
UpdateDirection(dir?: Vector3): Vector3
|
||||
{
|
||||
let rtDir = dir ? dir : new THREE.Vector3();
|
||||
let rtDir = dir ? dir : new Vector3();
|
||||
|
||||
rtDir.z = Math.sin(this.m_RoX);
|
||||
|
||||
@ -47,11 +47,11 @@ export class Orbit
|
||||
|
||||
/**
|
||||
* 使用观察向量,计算旋转角度
|
||||
*
|
||||
* @param {THREE.Vector3} dir
|
||||
*
|
||||
* @param {Vector3} dir
|
||||
* @memberof Orbit
|
||||
*/
|
||||
UpdateRoValue(dir: THREE.Vector3)
|
||||
UpdateRoValue(dir: Vector3)
|
||||
{
|
||||
dir.normalize();
|
||||
this.m_RoX = Math.asin(dir.z);
|
||||
@ -62,30 +62,30 @@ export class Orbit
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* 根据观察向量 求头部的向量.
|
||||
*
|
||||
*
|
||||
* @static
|
||||
* @param {THREE.Vector3} dir
|
||||
* @param {THREE.Vector3} [up]
|
||||
* @returns {THREE.Vector3}
|
||||
* @param {Vector3} dir
|
||||
* @param {Vector3} [up]
|
||||
* @returns {Vector3}
|
||||
* @memberof Orbit
|
||||
*/
|
||||
static ComputUpDirection(dir: THREE.Vector3, up?: THREE.Vector3): THREE.Vector3
|
||||
static ComputUpDirection(dir: Vector3, up?: Vector3): Vector3
|
||||
{
|
||||
let upRes = up ? up : new THREE.Vector3();
|
||||
if (dir.equals(new THREE.Vector3(0, 0, -1)))
|
||||
let upRes = up ? up : new Vector3();
|
||||
if (dir.equals(new Vector3(0, 0, -1)))
|
||||
{
|
||||
upRes.set(0, 1, 0);
|
||||
}
|
||||
else if (dir.equals(new THREE.Vector3(0, 0, 1)))
|
||||
else if (dir.equals(new Vector3(0, 0, 1)))
|
||||
{
|
||||
upRes.set(0, -1, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
let xv = new THREE.Vector3();
|
||||
xv.crossVectors(new THREE.Vector3(0, 0, 1), dir);
|
||||
let xv = new Vector3();
|
||||
xv.crossVectors(new Vector3(0, 0, 1), dir);
|
||||
upRes.crossVectors(dir, xv);
|
||||
upRes.normalize();
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ export class DbText extends Mesh
|
||||
{
|
||||
let font = FontLoaderUtil.Load();
|
||||
|
||||
let shapes: THREE.Shape[] = font.generateShapes(str, height, 0.1);
|
||||
let shapes: THREE.Shape[] = font.generateShapes(str, height);
|
||||
let geometry = new ShapeGeometry(shapes);
|
||||
|
||||
geometry.computeBoundingBox();
|
||||
@ -38,6 +38,6 @@ export class DbText extends Mesh
|
||||
super(geometry, ColorMaterial.GetBasicMaterial(5));
|
||||
|
||||
let center = geometry.boundingBox.getCenter(new Vector3());
|
||||
this.applyMatrix(MoveMatrix(new Vector3(-center.x, 0, 0)));
|
||||
this.applyMatrix4(MoveMatrix(new Vector3(-center.x, 0, 0)));
|
||||
}
|
||||
}
|
||||
|
@ -71,31 +71,6 @@ export class ThreeBSP
|
||||
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[2], uvs);
|
||||
vertex.applyMatrix4(this.matrix);
|
||||
polygon.vertices.push(vertex);
|
||||
} else if (typeof THREE.Face4)
|
||||
{
|
||||
vertex = geometry.vertices[face.a];
|
||||
uvs = faceVertexUvs ? new THREE.Vector2(faceVertexUvs[0].x, faceVertexUvs[0].y) : null;
|
||||
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[0], uvs);
|
||||
vertex.applyMatrix4(this.matrix);
|
||||
polygon.vertices.push(vertex);
|
||||
|
||||
vertex = geometry.vertices[face.b];
|
||||
uvs = faceVertexUvs ? new THREE.Vector2(faceVertexUvs[1].x, faceVertexUvs[1].y) : null;
|
||||
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[1], uvs);
|
||||
vertex.applyMatrix4(this.matrix);
|
||||
polygon.vertices.push(vertex);
|
||||
|
||||
vertex = geometry.vertices[face.c];
|
||||
uvs = faceVertexUvs ? new THREE.Vector2(faceVertexUvs[2].x, faceVertexUvs[2].y) : null;
|
||||
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[2], uvs);
|
||||
vertex.applyMatrix4(this.matrix);
|
||||
polygon.vertices.push(vertex);
|
||||
|
||||
vertex = geometry.vertices[face.d];
|
||||
uvs = faceVertexUvs ? new THREE.Vector2(faceVertexUvs[3].x, faceVertexUvs[3].y) : null;
|
||||
vertex = new Vertex(vertex.x, vertex.y, vertex.z, face.vertexNormals[3], uvs);
|
||||
vertex.applyMatrix4(this.matrix);
|
||||
polygon.vertices.push(vertex);
|
||||
} else
|
||||
{
|
||||
throw 'Invalid face type at index ' + i;
|
||||
|
@ -1,7 +1,6 @@
|
||||
import * as THREE from 'three';
|
||||
import { CylinderGeometry, Geometry, LineSegments, Mesh, Shape, Vector2 } from 'three';
|
||||
import { CylinderGeometry, Geometry, LineSegments, Mesh, Shape, Vector2, Vector3, Matrix4, ExtrudeGeometry, EdgesGeometry } from 'three';
|
||||
import { ColorMaterial } from './ColorPalette';
|
||||
import { polar } from './GeUtils';
|
||||
import { equalv3, polar } from './GeUtils';
|
||||
import { boardMaterial, edgeMaterial } from './Material';
|
||||
import { RotateUVs } from './RotateUV';
|
||||
import { ThreeBSP } from './ThreeCSG';
|
||||
@ -10,16 +9,16 @@ export class Arc2d
|
||||
{
|
||||
m_StartAn: number;
|
||||
m_EndAn: number;
|
||||
m_StartPoint: THREE.Vector2;
|
||||
m_EndPoint: THREE.Vector2;
|
||||
m_Center: THREE.Vector2;
|
||||
m_StartPoint: Vector2;
|
||||
m_EndPoint: Vector2;
|
||||
m_Center: Vector2;
|
||||
m_Radius: number;
|
||||
constructor(p1: THREE.Vector2, p2: THREE.Vector2, bul: number)
|
||||
constructor(p1: Vector2, p2: Vector2, bul: number)
|
||||
{
|
||||
this.m_StartPoint = p1.clone();
|
||||
this.m_EndPoint = p2.clone();
|
||||
|
||||
let vec: THREE.Vector2 = p2.clone().sub(p1);
|
||||
let vec: Vector2 = p2.clone().sub(p1);
|
||||
let len = vec.length();
|
||||
let an = vec.angle();
|
||||
this.m_Radius = len / Math.sin(2 * Math.atan(bul)) / 2;
|
||||
@ -44,7 +43,7 @@ export class Arc2d
|
||||
}
|
||||
}
|
||||
|
||||
//创建轮廓 通过点表和凸度
|
||||
//创建轮廓 通过点表和凸度
|
||||
export function createPath(pts: Vector2[], buls: number[], shapeOut?: Shape): Shape
|
||||
{
|
||||
let shape = shapeOut || new Shape();
|
||||
@ -72,23 +71,23 @@ export function createPath(pts: Vector2[], buls: number[], shapeOut?: Shape): Sh
|
||||
}
|
||||
return shape;
|
||||
}
|
||||
export function getVec(data: object): THREE.Vector3
|
||||
export function getVec(data: object): Vector3
|
||||
{
|
||||
return new THREE.Vector3(data["x"], data["y"], data["z"]);
|
||||
return new Vector3(data["x"], data["y"], data["z"]);
|
||||
}
|
||||
|
||||
//创建板件 暂时这么写
|
||||
export function createBoard(boardData: object)
|
||||
{
|
||||
let pts: THREE.Vector2[] = [];
|
||||
let pts: Vector2[] = [];
|
||||
let buls: number[] = [];
|
||||
let boardPts = boardData["Pts"];
|
||||
let boardBuls = boardData["Buls"];
|
||||
|
||||
let boardHeight = boardData["H"];
|
||||
|
||||
let boardMat = new THREE.Matrix4();
|
||||
let matInv: THREE.Matrix4 = new THREE.Matrix4();
|
||||
let boardMat = new Matrix4();
|
||||
let matInv: Matrix4 = new Matrix4();
|
||||
//InitBoardMat
|
||||
let xD = getVec(boardData["XVec"]);
|
||||
let yD = getVec(boardData["YVec"]);
|
||||
@ -97,7 +96,7 @@ export function createBoard(boardData: object)
|
||||
|
||||
boardMat.makeBasis(xD, yD, ZD);
|
||||
boardMat.setPosition(pBase);
|
||||
matInv.getInverse(boardMat, true);
|
||||
matInv.getInverse(boardMat);
|
||||
|
||||
if (boardPts && boardPts.length !== 0)
|
||||
for (let i = 0; i < boardPts.length; i++)
|
||||
@ -105,7 +104,7 @@ export function createBoard(boardData: object)
|
||||
let pt = getVec(boardPts[i]);
|
||||
if (boardPts[i].z !== undefined)
|
||||
pt.applyMatrix4(matInv);
|
||||
pts.push(new THREE.Vector2(pt.x, pt.y));
|
||||
pts.push(new Vector2(pt.x, pt.y));
|
||||
buls.push(boardBuls[i]);
|
||||
}
|
||||
else
|
||||
@ -126,14 +125,20 @@ export function createBoard(boardData: object)
|
||||
let extrudeSettings = {
|
||||
steps: 1,
|
||||
bevelEnabled: false,
|
||||
amount: boardHeight
|
||||
depth: boardHeight
|
||||
};
|
||||
|
||||
let ext = new THREE.ExtrudeGeometry(sp, extrudeSettings) as Geometry;
|
||||
let ext = new ExtrudeGeometry(sp, extrudeSettings) as Geometry;
|
||||
ext.computeBoundingSphere();
|
||||
ext.computeBoundingBox();
|
||||
ext.translate(0, 0, -boardHeight)
|
||||
ext.applyMatrix(boardMat);
|
||||
ext.applyMatrix4(boardMat);
|
||||
|
||||
if (!equalv3(xD.clone().cross(yD), ZD))
|
||||
{
|
||||
for (let f of ext.faces)
|
||||
[f.a, f.c] = [f.c, f.a];
|
||||
}
|
||||
|
||||
//外边.
|
||||
let edges: (LineSegments | Mesh)[] = [createEdge(ext)];
|
||||
@ -167,7 +172,7 @@ export function createBoard(boardData: object)
|
||||
else //1反
|
||||
geo.translate(dri.x, dri.y, dri.h * 0.5 - boardData["H"]);
|
||||
|
||||
geo.applyMatrix(boardMat);
|
||||
geo.applyMatrix4(boardMat);
|
||||
|
||||
let mesh = new Mesh(geo, ColorMaterial.GetBasicMaterial(1));
|
||||
edges.push(mesh);
|
||||
@ -185,7 +190,7 @@ export function createBoard(boardData: object)
|
||||
if (boardData["BoardName"] === "地脚线")
|
||||
RotateUVs(ext);
|
||||
|
||||
let mesh = new THREE.Mesh(ext, boardMaterial);
|
||||
let mesh = new Mesh(ext, boardMaterial);
|
||||
mesh.userData = ZD;
|
||||
edges.forEach(e => e.userData = ZD);
|
||||
return { mesh, edges };
|
||||
@ -211,6 +216,6 @@ export function createTemplateBoard(brDataList: any[])
|
||||
|
||||
export function createEdge(geo: Geometry): LineSegments
|
||||
{
|
||||
let edge = new THREE.EdgesGeometry(geo, 1);
|
||||
let edge = new EdgesGeometry(geo, 1);
|
||||
return new LineSegments(edge, edgeMaterial);
|
||||
}
|
||||
|
@ -96,7 +96,7 @@ downloadTypes({
|
||||
urlPath: "https://gitee.com/BearCAD/DefinitelyType2/raw/master/three/",
|
||||
files: [
|
||||
// "index.d.ts",
|
||||
"three-core.d.ts",
|
||||
// "three-core.d.ts",
|
||||
// "three-outlinepass.d.ts",
|
||||
// "three-smaapass.d.ts"
|
||||
]
|
||||
|
Loading…
Reference in New Issue
Block a user