Browse Source

Merge pull request #16590 from sciecode/dev5

Triangle: include isFrontFacing
Mr.doob 6 years ago
parent
commit
fce051cf61
3 changed files with 45 additions and 0 deletions
  1. 7 0
      src/math/Triangle.d.ts
  2. 23 0
      src/math/Triangle.js
  3. 15 0
      test/unit/src/math/Triangle.tests.js

+ 7 - 0
src/math/Triangle.d.ts

@@ -30,6 +30,7 @@ export class Triangle {
 	getPlane( target: Vector3 ): Plane;
 	getBarycoord( point: Vector3, target: Vector3 ): Vector3;
 	containsPoint( point: Vector3 ): boolean;
+	isFrontFacing( direction: Vector3 ): boolean;
 	closestPointToPoint( point: Vector3, target: Vector3 ): Vector3;
 	equals( triangle: Triangle ): boolean;
 
@@ -52,5 +53,11 @@ export class Triangle {
 		b: Vector3,
 		c: Vector3
 	): boolean;
+	static isFrontFacing(
+		a: Vector3,
+		b: Vector3,
+		c: Vector3,
+		direction: Vector3
+	): boolean;
 
 }

+ 23 - 0
src/math/Triangle.js

@@ -125,6 +125,23 @@ Object.assign( Triangle, {
 
 		};
 
+	}(),
+
+	isFrontFacing: function () {
+
+		var v0 = new Vector3();
+		var v1 = new Vector3();
+
+		return function isFrontFacing( a, b, c, direction ) {
+
+			v0.subVectors( c, b );
+			v1.subVectors( a, b );
+
+			// strictly front facing
+			return ( v0.cross( v1 ).dot( direction ) < 0 ) ? true : false;
+
+		};
+
 	}()
 
 } );
@@ -233,6 +250,12 @@ Object.assign( Triangle.prototype, {
 
 	},
 
+	isFrontFacing: function ( direction ) {
+
+		return Triangle.isFrontFacing( this.a, this.b, this.c, direction );
+
+	},
+
 	intersectsBox: function ( box ) {
 
 		return box.intersectsTriangle( this );

+ 15 - 0
test/unit/src/math/Triangle.tests.js

@@ -305,6 +305,21 @@ export default QUnit.module( 'Maths', () => {
 
 		} );
 
+		QUnit.test( "isFrontFacing", ( assert ) => {
+
+			var a = new Triangle();
+			var dir = new Vector3();
+			assert.ok( ! a.isFrontFacing( dir ), "Passed!" );
+
+			var a = new Triangle( new Vector3( 0, 0, 0 ), new Vector3( 1, 0, 0 ), new Vector3( 0, 1, 0 ) );
+			var dir = new Vector3( 0, 0, - 1 );
+			assert.ok( a.isFrontFacing( dir ), "Passed!" );
+
+			var a = new Triangle( new Vector3( 0, 0, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 1, 0, 0 ) );
+			assert.ok( ! a.isFrontFacing( dir ), "Passed!" );
+
+		} );
+
 		QUnit.test( "equals", ( assert ) => {
 
 			var a = new Triangle(