source: other-projects/playing-in-the-street/summer-2013/trunk/Playing-in-the-Street-WPF/Content/Web/mrdoob-three.js-4862f5f/test/unit/math/Matrix4.js@ 28897

Last change on this file since 28897 was 28897, checked in by davidb, 10 years ago

GUI front-end to server base plus web page content

File size: 8.1 KB
Line 
1/**
2 * @author bhouston / http://exocortex.com
3 */
4
5module( "Matrix4" );
6
7var matrixEquals4 = function( a, b, tolerance ) {
8 tolerance = tolerance || 0.0001;
9 if( a.elements.length != b.elements.length ) {
10 return false;
11 }
12 for( var i = 0, il = a.elements.length; i < il; i ++ ) {
13 var delta = a.elements[i] - b.elements[i];
14 if( delta > tolerance ) {
15 return false;
16 }
17 }
18 return true;
19};
20
21test( "constructor", function() {
22 var a = new THREE.Matrix4();
23 ok( a.determinant() == 1, "Passed!" );
24
25 var b = new THREE.Matrix4( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
26 ok( b.elements[0] == 0 );
27 ok( b.elements[1] == 4 );
28 ok( b.elements[2] == 8 );
29 ok( b.elements[3] == 12 );
30 ok( b.elements[4] == 1 );
31 ok( b.elements[5] == 5 );
32 ok( b.elements[6] == 9 );
33 ok( b.elements[7] == 13 );
34 ok( b.elements[8] == 2 );
35 ok( b.elements[9] == 6 );
36 ok( b.elements[10] == 10 );
37 ok( b.elements[11] == 14 );
38 ok( b.elements[12] == 3 );
39 ok( b.elements[13] == 7 );
40 ok( b.elements[14] == 11 );
41 ok( b.elements[15] == 15 );
42
43 ok( ! matrixEquals4( a, b ), "Passed!" );
44});
45
46test( "copy", function() {
47 var a = new THREE.Matrix4( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
48 var b = new THREE.Matrix4().copy( a );
49
50 ok( matrixEquals4( a, b ), "Passed!" );
51
52 // ensure that it is a true copy
53 a.elements[0] = 2;
54 ok( ! matrixEquals4( a, b ), "Passed!" );
55});
56
57test( "set", function() {
58 var b = new THREE.Matrix4();
59 ok( b.determinant() == 1, "Passed!" );
60
61 b.set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
62 ok( b.elements[0] == 0 );
63 ok( b.elements[1] == 4 );
64 ok( b.elements[2] == 8 );
65 ok( b.elements[3] == 12 );
66 ok( b.elements[4] == 1 );
67 ok( b.elements[5] == 5 );
68 ok( b.elements[6] == 9 );
69 ok( b.elements[7] == 13 );
70 ok( b.elements[8] == 2 );
71 ok( b.elements[9] == 6 );
72 ok( b.elements[10] == 10 );
73 ok( b.elements[11] == 14 );
74 ok( b.elements[12] == 3 );
75 ok( b.elements[13] == 7 );
76 ok( b.elements[14] == 11 );
77 ok( b.elements[15] == 15 );
78});
79
80test( "identity", function() {
81 var b = new THREE.Matrix4( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
82 ok( b.elements[0] == 0 );
83 ok( b.elements[1] == 4 );
84 ok( b.elements[2] == 8 );
85 ok( b.elements[3] == 12 );
86 ok( b.elements[4] == 1 );
87 ok( b.elements[5] == 5 );
88 ok( b.elements[6] == 9 );
89 ok( b.elements[7] == 13 );
90 ok( b.elements[8] == 2 );
91 ok( b.elements[9] == 6 );
92 ok( b.elements[10] == 10 );
93 ok( b.elements[11] == 14 );
94 ok( b.elements[12] == 3 );
95 ok( b.elements[13] == 7 );
96 ok( b.elements[14] == 11 );
97 ok( b.elements[15] == 15 );
98
99 var a = new THREE.Matrix4();
100 ok( ! matrixEquals4( a, b ), "Passed!" );
101
102 b.identity();
103 ok( matrixEquals4( a, b ), "Passed!" );
104});
105
106test( "multiplyScalar", function() {
107 var b = new THREE.Matrix4( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
108 ok( b.elements[0] == 0 );
109 ok( b.elements[1] == 4 );
110 ok( b.elements[2] == 8 );
111 ok( b.elements[3] == 12 );
112 ok( b.elements[4] == 1 );
113 ok( b.elements[5] == 5 );
114 ok( b.elements[6] == 9 );
115 ok( b.elements[7] == 13 );
116 ok( b.elements[8] == 2 );
117 ok( b.elements[9] == 6 );
118 ok( b.elements[10] == 10 );
119 ok( b.elements[11] == 14 );
120 ok( b.elements[12] == 3 );
121 ok( b.elements[13] == 7 );
122 ok( b.elements[14] == 11 );
123 ok( b.elements[15] == 15 );
124
125 b.multiplyScalar( 2 );
126 ok( b.elements[0] == 0*2 );
127 ok( b.elements[1] == 4*2 );
128 ok( b.elements[2] == 8*2 );
129 ok( b.elements[3] == 12*2 );
130 ok( b.elements[4] == 1*2 );
131 ok( b.elements[5] == 5*2 );
132 ok( b.elements[6] == 9*2 );
133 ok( b.elements[7] == 13*2 );
134 ok( b.elements[8] == 2*2 );
135 ok( b.elements[9] == 6*2 );
136 ok( b.elements[10] == 10*2 );
137 ok( b.elements[11] == 14*2 );
138 ok( b.elements[12] == 3*2 );
139 ok( b.elements[13] == 7*2 );
140 ok( b.elements[14] == 11*2 );
141 ok( b.elements[15] == 15*2 );
142});
143
144test( "determinant", function() {
145 var a = new THREE.Matrix4();
146 ok( a.determinant() == 1, "Passed!" );
147
148 a.elements[0] = 2;
149 ok( a.determinant() == 2, "Passed!" );
150
151 a.elements[0] = 0;
152 ok( a.determinant() == 0, "Passed!" );
153
154 // calculated via http://www.euclideanspace.com/maths/algebra/matrix/functions/determinant/fourD/index.htm
155 a.set( 2, 3, 4, 5, -1, -21, -3, -4, 6, 7, 8, 10, -8, -9, -10, -12 );
156 ok( a.determinant() == 76, "Passed!" );
157});
158
159test( "getInverse", function() {
160 var identity = new THREE.Matrix4();
161
162 var a = new THREE.Matrix4();
163 var b = new THREE.Matrix4( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
164 var c = new THREE.Matrix4( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
165
166 ok( ! matrixEquals4( a, b ), "Passed!" );
167 b.getInverse( a, false );
168 ok( matrixEquals4( b, new THREE.Matrix4() ), "Passed!" );
169
170 try {
171 b.getInverse( c, true );
172 ok( false, "Passed!" ); // should never get here.
173 }
174 catch( err ) {
175 ok( true, "Passed!" );
176 }
177
178 var testMatrices = [
179 new THREE.Matrix4().makeRotationX( 0.3 ),
180 new THREE.Matrix4().makeRotationX( -0.3 ),
181 new THREE.Matrix4().makeRotationY( 0.3 ),
182 new THREE.Matrix4().makeRotationY( -0.3 ),
183 new THREE.Matrix4().makeRotationZ( 0.3 ),
184 new THREE.Matrix4().makeRotationZ( -0.3 ),
185 new THREE.Matrix4().makeScale( 1, 2, 3 ),
186 new THREE.Matrix4().makeScale( 1/8, 1/2, 1/3 ),
187 new THREE.Matrix4().makeFrustum( -1, 1, -1, 1, 1, 1000 ),
188 new THREE.Matrix4().makeFrustum( -16, 16, -9, 9, 0.1, 10000 ),
189 new THREE.Matrix4().makeTranslation( 1, 2, 3 )
190 ];
191
192 for( var i = 0, il = testMatrices.length; i < il; i ++ ) {
193 var m = testMatrices[i];
194
195 var mInverse = new THREE.Matrix4().getInverse( m );
196 var mSelfInverse = m.clone();
197 mSelfInverse.getInverse( mSelfInverse );
198
199
200 // self-inverse should the same as inverse
201 ok( matrixEquals4( mSelfInverse, mInverse ), "Passed!" );
202
203 // the determinant of the inverse should be the reciprocal
204 ok( Math.abs( m.determinant() * mInverse.determinant() - 1 ) < 0.0001, "Passed!" );
205
206 var mProduct = new THREE.Matrix4().multiplyMatrices( m, mInverse );
207
208 // the determinant of the identity matrix is 1
209 ok( Math.abs( mProduct.determinant() - 1 ) < 0.0001, "Passed!" );
210 ok( matrixEquals4( mProduct, identity ), "Passed!" );
211 }
212});
213
214test( "transpose", function() {
215 var a = new THREE.Matrix4();
216 var b = a.clone().transpose();
217 ok( matrixEquals4( a, b ), "Passed!" );
218
219 b = new THREE.Matrix4( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
220 var c = b.clone().transpose();
221 ok( ! matrixEquals4( b, c ), "Passed!" );
222 c.transpose();
223 ok( matrixEquals4( b, c ), "Passed!" );
224});
225
226test( "clone", function() {
227 var a = new THREE.Matrix4( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
228 var b = a.clone();
229
230 ok( matrixEquals4( a, b ), "Passed!" );
231
232 // ensure that it is a true copy
233 a.elements[0] = 2;
234 ok( ! matrixEquals4( a, b ), "Passed!" );
235});
236
237
238test( "compose/decompose", function() {
239 var tValues = [
240 new THREE.Vector3(),
241 new THREE.Vector3( 3, 0, 0 ),
242 new THREE.Vector3( 0, 4, 0 ),
243 new THREE.Vector3( 0, 0, 5 ),
244 new THREE.Vector3( -6, 0, 0 ),
245 new THREE.Vector3( 0, -7, 0 ),
246 new THREE.Vector3( 0, 0, -8 ),
247 new THREE.Vector3( -2, 5, -9 ),
248 new THREE.Vector3( -2, -5, -9 )
249 ];
250
251 var sValues = [
252 new THREE.Vector3( 1, 1, 1 ),
253 new THREE.Vector3( 2, 2, 2 ),
254 new THREE.Vector3( 1, -1, 1 ),
255 new THREE.Vector3( -1, 1, 1 ),
256 new THREE.Vector3( 1, 1, -1 ),
257 new THREE.Vector3( 2, -2, 1 ),
258 new THREE.Vector3( -1, 2, -2 ),
259 new THREE.Vector3( -1, -1, -1 ),
260 new THREE.Vector3( -2, -2, -2 )
261 ];
262
263 var rValues = [
264 new THREE.Quaternion(),
265 new THREE.Quaternion().setFromEuler( new THREE.Euler( 1, 1, 0 ) ),
266 new THREE.Quaternion().setFromEuler( new THREE.Euler( 1, -1, 1 ) ),
267 new THREE.Quaternion( 0, 0.9238795292366128, 0, 0.38268342717215614 )
268 ];
269
270
271 for( var ti = 0; ti < tValues.length; ti ++ ) {
272 for( var si = 0; si < sValues.length; si ++ ) {
273 for( var ri = 0; ri < rValues.length; ri ++ ) {
274 var t = tValues[ti];
275 var s = sValues[si];
276 var r = rValues[ri];
277
278 var m = new THREE.Matrix4().compose( t, r, s );
279 var t2 = new THREE.Vector3();
280 var r2 = new THREE.Quaternion();
281 var s2 = new THREE.Vector3();
282
283 m.decompose( t2, r2, s2 );
284
285 var m2 = new THREE.Matrix4().compose( t2, r2, s2 );
286
287 var matrixIsSame = matrixEquals4( m, m2 );
288 /* debug code
289 if( ! matrixIsSame ) {
290 console.log( t, s, r );
291 console.log( t2, s2, r2 );
292 console.log( m, m2 );
293 }*/
294 ok( matrixEquals4( m, m2 ), "Passed!" );
295
296 }
297 }
298 }
299});
Note: See TracBrowser for help on using the repository browser.