提交 05af1b28 编写于 作者: B Ben Houston

implemented Box3.transform, tested. Removed Box3/Box3.scale as it doesn't...

implemented Box3.transform, tested.  Removed Box3/Box3.scale as it doesn't work in the general case.  move tests to tests/math from tests/core to replace move of tested source files.
上级 40dd22c4
......@@ -237,15 +237,6 @@ THREE.Box2.prototype = {
},
scale: function ( factor ) {
var sizeDeltaHalf = this.size().multiplyScalar( ( factor - 1 ) * 0.5 );
this.expandByVector( sizeDeltaHalf );
return this;
},
equals: function ( box ) {
return box.min.equals( this.min ) && box.max.equals( this.max );
......
......@@ -244,19 +244,31 @@ THREE.Box3.prototype = {
},
translate: function ( offset ) {
this.min.addSelf( offset );
this.max.addSelf( offset );
transform: function ( matrix ) {
// NOTE: I am using a binary pattern to specify all 2^3 combinations below
var newPoints = [
matrix.multiplyVector3( THREE.Box3.__v0.set( this.min.x, this.min.y, this.min.z ) ), // 000
matrix.multiplyVector3( THREE.Box3.__v1.set( this.min.x, this.min.y, this.max.z ) ), // 001
matrix.multiplyVector3( THREE.Box3.__v2.set( this.min.x, this.max.y, this.min.z ) ), // 010
matrix.multiplyVector3( THREE.Box3.__v3.set( this.min.x, this.max.y, this.max.z ) ), // 011
matrix.multiplyVector3( THREE.Box3.__v4.set( this.max.x, this.min.y, this.min.z ) ), // 100
matrix.multiplyVector3( THREE.Box3.__v5.set( this.max.x, this.min.y, this.max.z ) ), // 101
matrix.multiplyVector3( THREE.Box3.__v6.set( this.max.x, this.max.y, this.min.z ) ), // 110
matrix.multiplyVector3( THREE.Box3.__v7.set( this.max.x, this.max.y, this.max.z ) ) // 111
];
this.makeEmpty();
this.setFromPoints( newPoints );
return this;
},
scale: function ( factor ) {
translate: function ( offset ) {
var sizeDeltaHalf = this.size().multiplyScalar( ( factor - 1 ) * 0.5 );
this.expandByVector( sizeDeltaHalf );
this.min.addSelf( offset );
this.max.addSelf( offset );
return this;
......@@ -276,4 +288,11 @@ THREE.Box3.prototype = {
};
THREE.Box3.__v0 = new THREE.Vector3();
THREE.Box3.__v1 = new THREE.Vector3();
THREE.Box3.__v2 = new THREE.Vector3();
THREE.Box3.__v3 = new THREE.Vector3();
THREE.Box3.__v4 = new THREE.Vector3();
THREE.Box3.__v5 = new THREE.Vector3();
THREE.Box3.__v6 = new THREE.Vector3();
THREE.Box3.__v7 = new THREE.Vector3();
......@@ -242,16 +242,4 @@ test( "translate", function() {
ok( a.clone().translate( one2 ).translate( one2.clone().negate() ).equals( a ), "Passed!" );
ok( d.clone().translate( one2 ).equals( b ), "Passed!" );
ok( b.clone().translate( one2.clone().negate() ).equals( d ), "Passed!" );
});
test( "scale", function() {
var a = new THREE.Box2( zero2, zero2 );
var b = new THREE.Box2( zero2, one2 );
var c = new THREE.Box2( one2.clone().negate(), one2 );
var d = new THREE.Box2( one2.clone().negate(), zero2 );
ok( a.clone().scale( 0 ).equals( a ), "Passed!" );
ok( c.clone().scale( 0 ).equals( a ), "Passed!" );
ok( b.clone().scale( 3 ).equals( new THREE.Box2( new THREE.Vector2( -1, -1, -1 ), new THREE.Vector2( 2, 2, 2 ) ) ), "Passed!" );
ok( d.clone().scale( 3 ).equals( new THREE.Box2( new THREE.Vector2( 2, 2, 2 ).negate(), new THREE.Vector2( 1, 1, 1 ) ) ), "Passed!" );
});
});
\ No newline at end of file
......@@ -232,26 +232,36 @@ test( "union", function() {
ok( b.clone().union( c ).equals( c ), "Passed!" );
});
test( "translate", function() {
var compareBox = function ( a, b, threshold ) {
threshold = threshold || 0.0001;
return ( a.min.distanceTo( b.min ) < threshold &&
a.max.distanceTo( b.max ) < threshold );
};
test( "transform", function() {
var a = new THREE.Box3( zero3, zero3 );
var b = new THREE.Box3( zero3, one3 );
var c = new THREE.Box3( one3.clone().negate(), one3 );
var d = new THREE.Box3( one3.clone().negate(), zero3 );
ok( a.clone().translate( one3 ).equals( new THREE.Box3( one3, one3 ) ), "Passed!" );
ok( a.clone().translate( one3 ).translate( one3.clone().negate() ).equals( a ), "Passed!" );
ok( d.clone().translate( one3 ).equals( b ), "Passed!" );
ok( b.clone().translate( one3.clone().negate() ).equals( d ), "Passed!" );
var m = new THREE.Matrix4();
var t1 = new THREE.Vector3( 1, -2, 1 );
m.makeTranslation( t1.x, t1.y, t1.z );
ok( compareBox( a.clone().transform( m ), a.clone().translate( t1 ) ), "Passed!" );
ok( compareBox( b.clone().transform( m ), b.clone().translate( t1 ) ), "Passed!" );
ok( compareBox( c.clone().transform( m ), c.clone().translate( t1 ) ), "Passed!" );
ok( compareBox( d.clone().transform( m ), d.clone().translate( t1 ) ), "Passed!" );
});
test( "scale", function() {
test( "translate", function() {
var a = new THREE.Box3( zero3, zero3 );
var b = new THREE.Box3( zero3, one3 );
var c = new THREE.Box3( one3.clone().negate(), one3 );
var d = new THREE.Box3( one3.clone().negate(), zero3 );
ok( a.clone().scale( 0 ).equals( a ), "Passed!" );
ok( c.clone().scale( 0 ).equals( a ), "Passed!" );
ok( b.clone().scale( 3 ).equals( new THREE.Box3( new THREE.Vector3( -1, -1, -1 ), new THREE.Vector3( 2, 2, 2 ) ) ), "Passed!" );
ok( d.clone().scale( 3 ).equals( new THREE.Box3( new THREE.Vector3( 2, 2, 2 ).negate(), new THREE.Vector3( 1, 1, 1 ) ) ), "Passed!" );
ok( a.clone().translate( one3 ).equals( new THREE.Box3( one3, one3 ) ), "Passed!" );
ok( a.clone().translate( one3 ).translate( one3.clone().negate() ).equals( a ), "Passed!" );
ok( d.clone().translate( one3 ).equals( b ), "Passed!" );
ok( b.clone().translate( one3.clone().negate() ).equals( d ), "Passed!" );
});
......@@ -149,26 +149,26 @@ test( "intersectPlane", function() {
});
test( "transformSelf", function() {
test( "transform", function() {
var a = new THREE.Ray( one3, new THREE.Vector3( 0, 0, 1 ) );
var m = new THREE.Matrix4().identity();
ok( a.clone().transformSelf( m ).equals( a ), "Passed!" );
ok( a.clone().transform( m ).equals( a ), "Passed!" );
a = new THREE.Ray( zero3, new THREE.Vector3( 0, 0, 1 ) );
m.rotateByAxis( new THREE.Vector3( 0, 0, 1 ), Math.PI );
ok( a.clone().transformSelf( m ).equals( a ), "Passed!" );
ok( a.clone().transform( m ).equals( a ), "Passed!" );
m.identity().rotateX( Math.PI );
var b = a.clone();
b.direction.negate();
var a2 = a.clone().transformSelf( m );
var a2 = a.clone().transform( m );
ok( a2.origin.distanceTo( b.origin ) < 0.0001, "Passed!" );
ok( a2.direction.distanceTo( b.direction ) < 0.0001, "Passed!" );
a.origin = new THREE.Vector3( 0, 0, 1 );
b.origin = new THREE.Vector3( 0, 0, -1 );
var a2 = a.clone().transformSelf( m );
var a2 = a.clone().transform( m );
ok( a2.origin.distanceTo( b.origin ) < 0.0001, "Passed!" );
ok( a2.direction.distanceTo( b.direction ) < 0.0001, "Passed!" );
});
......
......@@ -26,16 +26,16 @@
<!-- add class-based unit tests below -->
<script src="core/Constants.js"></script>
<script src="core/Box2.js"></script>
<script src="core/Box3.js"></script>
<script src="core/Plane.js"></script>
<script src="core/Ray.js"></script>
<script src="core/Sphere.js"></script>
<script src="core/Triangle.js"></script>
<script src="core/Vector2.js"></script>
<script src="core/Vector3.js"></script>
<script src="core/Vector4.js"></script>
<script src="math/Constants.js"></script>
<script src="math/Box2.js"></script>
<script src="math/Box3.js"></script>
<script src="math/Plane.js"></script>
<script src="math/Ray.js"></script>
<script src="math/Sphere.js"></script>
<script src="math/Triangle.js"></script>
<script src="math/Vector2.js"></script>
<script src="math/Vector3.js"></script>
<script src="math/Vector4.js"></script>
</body>
</html>
\ No newline at end of file
......@@ -15,16 +15,16 @@
<!-- add class-based unit tests below -->
<script src="core/Constants.js"></script>
<script src="core/Box2.js"></script>
<script src="core/Box3.js"></script>
<script src="core/Plane.js"></script>
<script src="core/Ray.js"></script>
<script src="core/Sphere.js"></script>
<script src="core/Triangle.js"></script>
<script src="core/Vector2.js"></script>
<script src="core/Vector3.js"></script>
<script src="core/Vector4.js"></script>
<script src="math/Constants.js"></script>
<script src="math/Box2.js"></script>
<script src="math/Box3.js"></script>
<script src="math/Plane.js"></script>
<script src="math/Ray.js"></script>
<script src="math/Sphere.js"></script>
<script src="math/Triangle.js"></script>
<script src="math/Vector2.js"></script>
<script src="math/Vector3.js"></script>
<script src="math/Vector4.js"></script>
</body>
</html>
......@@ -15,16 +15,16 @@
<!-- add class-based unit tests below -->
<script src="core/Constants.js"></script>
<script src="core/Box2.js"></script>
<script src="core/Box3.js"></script>
<script src="core/Plane.js"></script>
<script src="core/Ray.js"></script>
<script src="core/Sphere.js"></script>
<script src="core/Triangle.js"></script>
<script src="core/Vector2.js"></script>
<script src="core/Vector3.js"></script>
<script src="core/Vector4.js"></script>
<script src="math/Constants.js"></script>
<script src="math/Box2.js"></script>
<script src="math/Box3.js"></script>
<script src="math/Plane.js"></script>
<script src="math/Ray.js"></script>
<script src="math/Sphere.js"></script>
<script src="math/Triangle.js"></script>
<script src="math/Vector2.js"></script>
<script src="math/Vector3.js"></script>
<script src="math/Vector4.js"></script>
</body>
</html>
......@@ -15,16 +15,16 @@
<!-- add class-based unit tests below -->
<script src="core/Constants.js"></script>
<script src="core/Box2.js"></script>
<script src="core/Box3.js"></script>
<script src="core/Plane.js"></script>
<script src="core/Ray.js"></script>
<script src="core/Sphere.js"></script>
<script src="core/Triangle.js"></script>
<script src="core/Vector2.js"></script>
<script src="core/Vector3.js"></script>
<script src="core/Vector4.js"></script>
<script src="math/Constants.js"></script>
<script src="math/Box2.js"></script>
<script src="math/Box3.js"></script>
<script src="math/Plane.js"></script>
<script src="math/Ray.js"></script>
<script src="math/Sphere.js"></script>
<script src="math/Triangle.js"></script>
<script src="math/Vector2.js"></script>
<script src="math/Vector3.js"></script>
<script src="math/Vector4.js"></script>
</body>
</html>
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册