Browse Source

Merge pull request #19414 from pwmarcz/selection-box

SelectionBox: fix corner cases
Mr.doob 5 years ago
parent
commit
adc7b0ad1c
2 changed files with 28 additions and 6 deletions
  1. 15 3
      examples/js/interactive/SelectionBox.js
  2. 13 3
      examples/jsm/interactive/SelectionBox.js

+ 15 - 3
examples/js/interactive/SelectionBox.js

@@ -54,6 +54,20 @@ THREE.SelectionBox = ( function () {
 		startPoint = startPoint || this.startPoint;
 		endPoint = endPoint || this.endPoint;
 
+		// Avoid invalid frustum
+
+		if ( startPoint.x === endPoint.x ) {
+
+			endPoint.x += Number.EPSILON;
+
+		}
+
+		if ( startPoint.y === endPoint.y ) {
+
+			endPoint.y += Number.EPSILON;
+
+		}
+
 		this.camera.updateProjectionMatrix();
 		this.camera.updateMatrixWorld();
 
@@ -65,7 +79,7 @@ THREE.SelectionBox = ( function () {
 			endPoint.x = Math.max( startPoint.x, endPoint.x );
 			endPoint.y = Math.min( startPoint.y, endPoint.y );
 
-			vecNear.copy( this.camera.position );
+			vecNear.setFromMatrixPosition( this.camera.matrixWorld );
 			vecTopLeft.copy( tmpPoint );
 			vecTopRight.set( endPoint.x, tmpPoint.y, 0 );
 			vecDownRight.copy( endPoint );
@@ -102,8 +116,6 @@ THREE.SelectionBox = ( function () {
 
 		} else if ( this.camera.isOrthographicCamera ) {
 
-			if ( startPoint.equals( endPoint ) ) endPoint.addScalar( Number.EPSILON ); // avoid invalid frustum
-
 			var left = Math.min( startPoint.x, endPoint.x );
 			var top = Math.max( startPoint.y, endPoint.y );
 			var right = Math.max( startPoint.x, endPoint.x );

+ 13 - 3
examples/jsm/interactive/SelectionBox.js

@@ -59,6 +59,18 @@ var SelectionBox = ( function () {
 		startPoint = startPoint || this.startPoint;
 		endPoint = endPoint || this.endPoint;
 
+		if ( startPoint.x === endPoint.x ) {
+
+			endPoint.x += Number.EPSILON;
+
+		}
+
+		if ( startPoint.y === endPoint.y ) {
+
+			endPoint.y += Number.EPSILON;
+
+		}
+
 		this.camera.updateProjectionMatrix();
 		this.camera.updateMatrixWorld();
 
@@ -70,7 +82,7 @@ var SelectionBox = ( function () {
 			endPoint.x = Math.max( startPoint.x, endPoint.x );
 			endPoint.y = Math.min( startPoint.y, endPoint.y );
 
-			vecNear.copy( this.camera.position );
+			vecNear.copy( this.camera.getWorldPosition() );
 			vecTopLeft.copy( tmpPoint );
 			vecTopRight.set( endPoint.x, tmpPoint.y, 0 );
 			vecDownRight.copy( endPoint );
@@ -107,8 +119,6 @@ var SelectionBox = ( function () {
 
 		} else if ( this.camera.isOrthographicCamera ) {
 
-			if ( startPoint.equals( endPoint ) ) endPoint.addScalar( Number.EPSILON ); // avoid invalid frustum
-
 			var left = Math.min( startPoint.x, endPoint.x );
 			var top = Math.max( startPoint.y, endPoint.y );
 			var right = Math.max( startPoint.x, endPoint.x );