From c5e14654472b9f90c8ba94693c5ea29a59d9c1e2 Mon Sep 17 00:00:00 2001 From: blobt Date: Fri, 16 Apr 2021 14:53:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90vec3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/render/math/Vec2.ts | 6 +- src/render/math/Vec3.ts | 150 +++++++++++++++++++++++++++++++++++++--- 2 files changed, 145 insertions(+), 11 deletions(-) diff --git a/src/render/math/Vec2.ts b/src/render/math/Vec2.ts index 2b6baad6..78201853 100755 --- a/src/render/math/Vec2.ts +++ b/src/render/math/Vec2.ts @@ -1,7 +1,7 @@ /** * 二维向量 */ -export class Vec2 { +export class vec2 { /** * @var 数据存储内存 @@ -33,8 +33,8 @@ export class Vec2 { } } - copy(dest: Vec2 | null = null): Vec2 { - if (!dest) dest = new Vec2(); + copy(dest: vec2 | null = null): vec2 { + if (!dest) dest = new vec2(); dest.x = this.x; dest.y = this.y; return dest; diff --git a/src/render/math/Vec3.ts b/src/render/math/Vec3.ts index 7f84698f..10654bba 100755 --- a/src/render/math/Vec3.ts +++ b/src/render/math/Vec3.ts @@ -1,6 +1,6 @@ import { EPSILON } from "../common"; -export class Vec3 { +export class vec3 { /** * @var */ @@ -50,8 +50,8 @@ export class Vec3 { this.z = z; } - public copy(dest: Vec3 | null = null): Vec3 { - if (!dest) dest = new Vec3(); + public copy(dest: vec3 | null = null): vec3 { + if (!dest) dest = new vec3(); dest.x = this.x; dest.y = this.y; @@ -65,7 +65,7 @@ export class Vec3 { * @param dest * @returns */ - public negate(dest: Vec3 | null = null): Vec3 { + public negate(dest: vec3 | null = null): vec3 { if (!dest) dest = this; dest.x = -this.x; @@ -81,7 +81,7 @@ export class Vec3 { * @param threshold * @returns */ - public equals(vector: Vec3, threshold = EPSILON): boolean { + public equals(vector: vec3, threshold = EPSILON): boolean { if (Math.abs(this.x - vector.x) > threshold) return false; @@ -117,7 +117,7 @@ export class Vec3 { * @param vector * @returns */ - add(vector: Vec3): Vec3 { + add(vector: vec3): vec3 { this.x += vector.x; this.y += vector.y; this.z += vector.z; @@ -130,7 +130,7 @@ export class Vec3 { * @param vector * @returns */ - subtract(vector: Vec3): Vec3 { + subtract(vector: vec3): vec3 { this.x -= vector.x; this.y -= vector.y; this.z -= vector.z; @@ -145,7 +145,7 @@ export class Vec3 { * @param dest * @returns */ - public scale(value: number, dest: Vec3 | null = null): Vec3 { + public scale(value: number, dest: vec3 | null = null): vec3 { if (!dest) { dest = this; } else { @@ -158,4 +158,138 @@ export class Vec3 { return dest; } + + /** + * 向量单位化 + * @param dest + * @returns + */ + public normalize(dest: vec3 | null = null): vec3 { + if (!dest) { + dest = this; + } + + let length = this.length; + + if (length === 1) { + return this; + } + + if (length === 0) { + dest.x = 0 + dest.y = 0; + dest.z = 0; + + return dest; + } + + dest.x /= length; + dest.y /= length; + dest.z /= length; + + return dest; + } + + /** + * 向量单位化 + * @returns + */ + public normalize2(): number { + let length = this.length; + this.x /= length; + this.y /= length; + this.z /= length; + return length; + } + + /** + * 向量缩放 + * @param vector + * @param value + * @param dest + * @returns + */ + public static multiplyScalar(vector: vec3, value: number, dest: vec3 | null = null): vec3 { + if (!dest) dest = new vec3(); + dest.x *= value; + dest.y *= value; + dest.z *= value; + return dest; + } + + /** + * 向量叉乘 + * @param vector + * @param vector2 + * @param dest + * @returns + */ + public static cross(vector: vec3, vector2: vec3, dest: vec3 | null = null): vec3 { + if (!dest) dest = new vec3(); + + let x = vector.x, + y = vector.y, + z = vector.z; + + let x2 = vector2.x, + y2 = vector2.y, + z2 = vector2.z; + + dest.x = y * z2 - z * y2; + dest.y = z * x2 - x * z2; + dest.z = x * y2 - y * x2; + + return dest; + } + + /** + * 向量点乘 + * @param vector + * @param vector2 + * @returns + */ + public static dot(vector: vec3, vector2: vec3): number { + let x = vector.x, + y = vector.y, + z = vector.z; + + let x2 = vector2.x, + y2 = vector2.y, + z2 = vector2.z; + + return (x * x2 + y * y2 + z * z2); + } + + public static sum(vector: vec3, vector2: vec3, dest: vec3 | null = null): vec3 { + if (!dest) dest = new vec3(); + + dest.x = vector.x + vector2.x; + dest.y = vector.y + vector2.y; + dest.z = vector.z + vector2.z; + + return dest; + } + + public static difference(vector: vec3, vector2: vec3, dest: vec3 | null = null): vec3 { + if (!dest) dest = new vec3(); + + dest.x = vector.x - vector2.x; + dest.y = vector.y - vector2.y; + dest.z = vector.z - vector2.z; + + return dest; + } + + static readonly up = new vec3([0, 1, 0]); + static readonly down = new vec3([0, -1, 0]); + static readonly right = new vec3([1, 0, 0]); + static readonly left = new vec3([-1, 0, 0]); + static readonly forward = new vec3([0, 0, 1]); + static readonly backward = new vec3([0, 0, -1]); + + static readonly zero = new vec3([0, 0, 0]); + + static v0 = new vec3([0, 0, 0]); + static v1 = new vec3([0, 0, 0]); + static v2 = new vec3([0, 0, 0]); } \ No newline at end of file