Matrix4.tests.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. /**
  2. * @author bhouston / http://exocortex.com
  3. * @author TristanVALCKE / https://github.com/Itee
  4. */
  5. /* global QUnit */
  6. import { Matrix4 } from '../../../../src/math/Matrix4';
  7. import { Vector3 } from '../../../../src/math/Vector3';
  8. import { Euler } from '../../../../src/math/Euler';
  9. import { Quaternion } from '../../../../src/math/Quaternion';
  10. import { Float32BufferAttribute } from '../../../../src/core/BufferAttribute';
  11. import { _Math } from '../../../../src/math/Math';
  12. import { eps } from './Constants.tests';
  13. function matrixEquals4( a, b, tolerance ) {
  14. tolerance = tolerance || 0.0001;
  15. if ( a.elements.length != b.elements.length ) {
  16. return false;
  17. }
  18. for ( var i = 0, il = a.elements.length; i < il; i ++ ) {
  19. var delta = a.elements[ i ] - b.elements[ i ];
  20. if ( delta > tolerance ) {
  21. return false;
  22. }
  23. }
  24. return true;
  25. }
  26. // from Euler.js
  27. function eulerEquals( a, b, tolerance ) {
  28. tolerance = tolerance || 0.0001;
  29. var diff = Math.abs( a.x - b.x ) + Math.abs( a.y - b.y ) + Math.abs( a.z - b.z );
  30. return ( diff < tolerance );
  31. }
  32. export default QUnit.module( 'Maths', () => {
  33. QUnit.module.todo( 'Matrix4', () => {
  34. // INSTANCING
  35. QUnit.test( "Instancing", ( assert ) => {
  36. var a = new Matrix4();
  37. assert.ok( a.determinant() == 1, "Passed!" );
  38. var b = new Matrix4().set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  39. assert.ok( b.elements[ 0 ] == 0 );
  40. assert.ok( b.elements[ 1 ] == 4 );
  41. assert.ok( b.elements[ 2 ] == 8 );
  42. assert.ok( b.elements[ 3 ] == 12 );
  43. assert.ok( b.elements[ 4 ] == 1 );
  44. assert.ok( b.elements[ 5 ] == 5 );
  45. assert.ok( b.elements[ 6 ] == 9 );
  46. assert.ok( b.elements[ 7 ] == 13 );
  47. assert.ok( b.elements[ 8 ] == 2 );
  48. assert.ok( b.elements[ 9 ] == 6 );
  49. assert.ok( b.elements[ 10 ] == 10 );
  50. assert.ok( b.elements[ 11 ] == 14 );
  51. assert.ok( b.elements[ 12 ] == 3 );
  52. assert.ok( b.elements[ 13 ] == 7 );
  53. assert.ok( b.elements[ 14 ] == 11 );
  54. assert.ok( b.elements[ 15 ] == 15 );
  55. assert.ok( ! matrixEquals4( a, b ), "Passed!" );
  56. } );
  57. // PUBLIC STUFF
  58. QUnit.test( "isMatrix4", ( assert ) => {
  59. assert.ok( false, "everything's gonna be alright" );
  60. } );
  61. QUnit.test( "set", ( assert ) => {
  62. var b = new Matrix4();
  63. assert.ok( b.determinant() == 1, "Passed!" );
  64. b.set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  65. assert.ok( b.elements[ 0 ] == 0 );
  66. assert.ok( b.elements[ 1 ] == 4 );
  67. assert.ok( b.elements[ 2 ] == 8 );
  68. assert.ok( b.elements[ 3 ] == 12 );
  69. assert.ok( b.elements[ 4 ] == 1 );
  70. assert.ok( b.elements[ 5 ] == 5 );
  71. assert.ok( b.elements[ 6 ] == 9 );
  72. assert.ok( b.elements[ 7 ] == 13 );
  73. assert.ok( b.elements[ 8 ] == 2 );
  74. assert.ok( b.elements[ 9 ] == 6 );
  75. assert.ok( b.elements[ 10 ] == 10 );
  76. assert.ok( b.elements[ 11 ] == 14 );
  77. assert.ok( b.elements[ 12 ] == 3 );
  78. assert.ok( b.elements[ 13 ] == 7 );
  79. assert.ok( b.elements[ 14 ] == 11 );
  80. assert.ok( b.elements[ 15 ] == 15 );
  81. } );
  82. QUnit.test( "identity", ( assert ) => {
  83. var b = new Matrix4().set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  84. assert.ok( b.elements[ 0 ] == 0 );
  85. assert.ok( b.elements[ 1 ] == 4 );
  86. assert.ok( b.elements[ 2 ] == 8 );
  87. assert.ok( b.elements[ 3 ] == 12 );
  88. assert.ok( b.elements[ 4 ] == 1 );
  89. assert.ok( b.elements[ 5 ] == 5 );
  90. assert.ok( b.elements[ 6 ] == 9 );
  91. assert.ok( b.elements[ 7 ] == 13 );
  92. assert.ok( b.elements[ 8 ] == 2 );
  93. assert.ok( b.elements[ 9 ] == 6 );
  94. assert.ok( b.elements[ 10 ] == 10 );
  95. assert.ok( b.elements[ 11 ] == 14 );
  96. assert.ok( b.elements[ 12 ] == 3 );
  97. assert.ok( b.elements[ 13 ] == 7 );
  98. assert.ok( b.elements[ 14 ] == 11 );
  99. assert.ok( b.elements[ 15 ] == 15 );
  100. var a = new Matrix4();
  101. assert.ok( ! matrixEquals4( a, b ), "Passed!" );
  102. b.identity();
  103. assert.ok( matrixEquals4( a, b ), "Passed!" );
  104. } );
  105. QUnit.test( "clone", ( assert ) => {
  106. var a = new Matrix4().set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  107. var b = a.clone();
  108. assert.ok( matrixEquals4( a, b ), "Passed!" );
  109. // ensure that it is a true copy
  110. a.elements[ 0 ] = 2;
  111. assert.ok( ! matrixEquals4( a, b ), "Passed!" );
  112. } );
  113. QUnit.test( "copy", ( assert ) => {
  114. var a = new Matrix4().set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  115. var b = new Matrix4().copy( a );
  116. assert.ok( matrixEquals4( a, b ), "Passed!" );
  117. // ensure that it is a true copy
  118. a.elements[ 0 ] = 2;
  119. assert.ok( ! matrixEquals4( a, b ), "Passed!" );
  120. } );
  121. QUnit.test( "copyPosition", ( assert ) => {
  122. var a = new Matrix4().set( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );
  123. var b = new Matrix4().set( 1, 2, 3, 0, 5, 6, 7, 0, 9, 10, 11, 0, 13, 14, 15, 16 );
  124. assert.notOk( matrixEquals4( a, b ), "a and b initially not equal" );
  125. b.copyPosition( a );
  126. assert.ok( matrixEquals4( a, b ), "a and b equal after copyPosition()" );
  127. } );
  128. QUnit.test( "makeBasis/extractBasis", ( assert ) => {
  129. var identityBasis = [ new Vector3( 1, 0, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ) ];
  130. var a = new Matrix4().makeBasis( identityBasis[ 0 ], identityBasis[ 1 ], identityBasis[ 2 ] );
  131. var identity = new Matrix4();
  132. assert.ok( matrixEquals4( a, identity ), "Passed!" );
  133. var testBases = [[ new Vector3( 0, 1, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ) ]];
  134. for ( var i = 0; i < testBases.length; i ++ ) {
  135. var testBasis = testBases[ i ];
  136. var b = new Matrix4().makeBasis( testBasis[ 0 ], testBasis[ 1 ], testBasis[ 2 ] );
  137. var outBasis = [ new Vector3(), new Vector3(), new Vector3() ];
  138. b.extractBasis( outBasis[ 0 ], outBasis[ 1 ], outBasis[ 2 ] );
  139. // check what goes in, is what comes out.
  140. for ( var j = 0; j < outBasis.length; j ++ ) {
  141. assert.ok( outBasis[ j ].equals( testBasis[ j ] ), "Passed!" );
  142. }
  143. // get the basis out the hard war
  144. for ( var j = 0; j < identityBasis.length; j ++ ) {
  145. outBasis[ j ].copy( identityBasis[ j ] );
  146. outBasis[ j ].applyMatrix4( b );
  147. }
  148. // did the multiply method of basis extraction work?
  149. for ( var j = 0; j < outBasis.length; j ++ ) {
  150. assert.ok( outBasis[ j ].equals( testBasis[ j ] ), "Passed!" );
  151. }
  152. }
  153. } );
  154. QUnit.test( "extractRotation", ( assert ) => {
  155. assert.ok( false, "everything's gonna be alright" );
  156. } );
  157. QUnit.test( "makeRotationFromEuler/extractRotation", ( assert ) => {
  158. var testValues = [
  159. new Euler( 0, 0, 0, "XYZ" ),
  160. new Euler( 1, 0, 0, "XYZ" ),
  161. new Euler( 0, 1, 0, "ZYX" ),
  162. new Euler( 0, 0, 0.5, "YZX" ),
  163. new Euler( 0, 0, - 0.5, "YZX" )
  164. ];
  165. for ( var i = 0; i < testValues.length; i ++ ) {
  166. var v = testValues[ i ];
  167. var m = new Matrix4().makeRotationFromEuler( v );
  168. var v2 = new Euler().setFromRotationMatrix( m, v.order );
  169. var m2 = new Matrix4().makeRotationFromEuler( v2 );
  170. assert.ok( matrixEquals4( m, m2, eps ), "makeRotationFromEuler #" + i + ": original and Euler-derived matrices are equal" );
  171. assert.ok( eulerEquals( v, v2, eps ), "makeRotationFromEuler #" + i + ": original and matrix-derived Eulers are equal" );
  172. var m3 = new Matrix4().extractRotation( m2 );
  173. var v3 = new Euler().setFromRotationMatrix( m3, v.order );
  174. assert.ok( matrixEquals4( m, m3, eps ), "extractRotation #" + i + ": original and extracted matrices are equal" );
  175. assert.ok( eulerEquals( v, v3, eps ), "extractRotation #" + i + ": original and extracted Eulers are equal" );
  176. }
  177. } );
  178. QUnit.test( "lookAt", ( assert ) => {
  179. var a = new Matrix4();
  180. var expected = new Matrix4().identity();
  181. var eye = new Vector3( 0, 0, 0 );
  182. var target = new Vector3( 0, 1, - 1 );
  183. var up = new Vector3( 0, 1, 0 );
  184. a.lookAt( eye, target, up );
  185. var rotation = new Euler().setFromRotationMatrix( a );
  186. assert.numEqual( rotation.x * ( 180 / Math.PI ), 45, "Check the rotation" );
  187. // eye and target are in the same position
  188. eye.copy( target );
  189. a.lookAt( eye, target, up );
  190. assert.ok( matrixEquals4( a, expected ), "Check the result for eye == target" );
  191. // up and z are parallel
  192. eye.set( 0, 1, 0 );
  193. target.set( 0, 0, 0 );
  194. a.lookAt( eye, target, up );
  195. expected.set(
  196. 1, 0, 0, 0,
  197. 0, 0.0001, 1, 0,
  198. 0, - 1, 0.0001, 0,
  199. 0, 0, 0, 1
  200. );
  201. assert.ok( matrixEquals4( a, expected ), "Check the result for when up and z are parallel" );
  202. } );
  203. QUnit.test( "multiply", ( assert ) => {
  204. assert.ok( false, "everything's gonna be alright" );
  205. } );
  206. QUnit.test( "premultiply", ( assert ) => {
  207. assert.ok( false, "everything's gonna be alright" );
  208. } );
  209. QUnit.test( "multiplyMatrices", ( assert ) => {
  210. // Reference:
  211. //
  212. // #!/usr/bin/env python
  213. // from __future__ import print_function
  214. // import numpy as np
  215. // print(
  216. // np.dot(
  217. // np.reshape([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53], (4, 4)),
  218. // np.reshape([59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131], (4, 4))
  219. // )
  220. // )
  221. //
  222. // [[ 1585 1655 1787 1861]
  223. // [ 5318 5562 5980 6246]
  224. // [10514 11006 11840 12378]
  225. // [15894 16634 17888 18710]]
  226. var lhs = new Matrix4().set( 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53 );
  227. var rhs = new Matrix4().set( 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131 );
  228. var ans = new Matrix4();
  229. ans.multiplyMatrices( lhs, rhs );
  230. assert.ok( ans.elements[ 0 ] == 1585 );
  231. assert.ok( ans.elements[ 1 ] == 5318 );
  232. assert.ok( ans.elements[ 2 ] == 10514 );
  233. assert.ok( ans.elements[ 3 ] == 15894 );
  234. assert.ok( ans.elements[ 4 ] == 1655 );
  235. assert.ok( ans.elements[ 5 ] == 5562 );
  236. assert.ok( ans.elements[ 6 ] == 11006 );
  237. assert.ok( ans.elements[ 7 ] == 16634 );
  238. assert.ok( ans.elements[ 8 ] == 1787 );
  239. assert.ok( ans.elements[ 9 ] == 5980 );
  240. assert.ok( ans.elements[ 10 ] == 11840 );
  241. assert.ok( ans.elements[ 11 ] == 17888 );
  242. assert.ok( ans.elements[ 12 ] == 1861 );
  243. assert.ok( ans.elements[ 13 ] == 6246 );
  244. assert.ok( ans.elements[ 14 ] == 12378 );
  245. assert.ok( ans.elements[ 15 ] == 18710 );
  246. } );
  247. QUnit.test( "multiplyScalar", ( assert ) => {
  248. var b = new Matrix4().set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  249. assert.ok( b.elements[ 0 ] == 0 );
  250. assert.ok( b.elements[ 1 ] == 4 );
  251. assert.ok( b.elements[ 2 ] == 8 );
  252. assert.ok( b.elements[ 3 ] == 12 );
  253. assert.ok( b.elements[ 4 ] == 1 );
  254. assert.ok( b.elements[ 5 ] == 5 );
  255. assert.ok( b.elements[ 6 ] == 9 );
  256. assert.ok( b.elements[ 7 ] == 13 );
  257. assert.ok( b.elements[ 8 ] == 2 );
  258. assert.ok( b.elements[ 9 ] == 6 );
  259. assert.ok( b.elements[ 10 ] == 10 );
  260. assert.ok( b.elements[ 11 ] == 14 );
  261. assert.ok( b.elements[ 12 ] == 3 );
  262. assert.ok( b.elements[ 13 ] == 7 );
  263. assert.ok( b.elements[ 14 ] == 11 );
  264. assert.ok( b.elements[ 15 ] == 15 );
  265. b.multiplyScalar( 2 );
  266. assert.ok( b.elements[ 0 ] == 0 * 2 );
  267. assert.ok( b.elements[ 1 ] == 4 * 2 );
  268. assert.ok( b.elements[ 2 ] == 8 * 2 );
  269. assert.ok( b.elements[ 3 ] == 12 * 2 );
  270. assert.ok( b.elements[ 4 ] == 1 * 2 );
  271. assert.ok( b.elements[ 5 ] == 5 * 2 );
  272. assert.ok( b.elements[ 6 ] == 9 * 2 );
  273. assert.ok( b.elements[ 7 ] == 13 * 2 );
  274. assert.ok( b.elements[ 8 ] == 2 * 2 );
  275. assert.ok( b.elements[ 9 ] == 6 * 2 );
  276. assert.ok( b.elements[ 10 ] == 10 * 2 );
  277. assert.ok( b.elements[ 11 ] == 14 * 2 );
  278. assert.ok( b.elements[ 12 ] == 3 * 2 );
  279. assert.ok( b.elements[ 13 ] == 7 * 2 );
  280. assert.ok( b.elements[ 14 ] == 11 * 2 );
  281. assert.ok( b.elements[ 15 ] == 15 * 2 );
  282. } );
  283. QUnit.test( "applyToBufferAttribute", ( assert ) => {
  284. var a = new Matrix4().set( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );
  285. var attr = new Float32BufferAttribute( [ 1, 2, 1, 3, 0, 3 ], 3 );
  286. var expected = new Float32BufferAttribute( [
  287. 0.1666666716337204, 0.4444444477558136, 0.7222222089767456,
  288. 0.1599999964237213, 0.4399999976158142, 0.7200000286102295
  289. ], 3 );
  290. var applied = a.applyToBufferAttribute( attr );
  291. assert.strictEqual( expected.count, applied.count, "Applied buffer and expected buffer have the same number of entries" );
  292. for ( var i = 0, l = expected.count; i < l; i ++ ) {
  293. assert.ok( Math.abs( applied.getX( i ) - expected.getX( i ) ) <= eps, "Check x" );
  294. assert.ok( Math.abs( applied.getY( i ) - expected.getY( i ) ) <= eps, "Check y" );
  295. assert.ok( Math.abs( applied.getZ( i ) - expected.getZ( i ) ) <= eps, "Check z" );
  296. }
  297. } );
  298. QUnit.test( "determinant", ( assert ) => {
  299. var a = new Matrix4();
  300. assert.ok( a.determinant() == 1, "Passed!" );
  301. a.elements[ 0 ] = 2;
  302. assert.ok( a.determinant() == 2, "Passed!" );
  303. a.elements[ 0 ] = 0;
  304. assert.ok( a.determinant() == 0, "Passed!" );
  305. // calculated via http://www.euclideanspace.com/maths/algebra/matrix/functions/determinant/fourD/index.htm
  306. a.set( 2, 3, 4, 5, - 1, - 21, - 3, - 4, 6, 7, 8, 10, - 8, - 9, - 10, - 12 );
  307. assert.ok( a.determinant() == 76, "Passed!" );
  308. } );
  309. QUnit.test( "transpose", ( assert ) => {
  310. var a = new Matrix4();
  311. var b = a.clone().transpose();
  312. assert.ok( matrixEquals4( a, b ), "Passed!" );
  313. var b = new Matrix4().set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 );
  314. var c = b.clone().transpose();
  315. assert.ok( ! matrixEquals4( b, c ), "Passed!" );
  316. c.transpose();
  317. assert.ok( matrixEquals4( b, c ), "Passed!" );
  318. } );
  319. QUnit.test( "setPosition", ( assert ) => {
  320. assert.ok( false, "everything's gonna be alright" );
  321. } );
  322. QUnit.test( "getInverse", ( assert ) => {
  323. var identity = new Matrix4();
  324. var a = new Matrix4();
  325. var b = new Matrix4().set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
  326. var c = new Matrix4().set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
  327. assert.ok( ! matrixEquals4( a, b ), "Passed!" );
  328. b.getInverse( a, false );
  329. assert.ok( matrixEquals4( b, new Matrix4() ), "Passed!" );
  330. try {
  331. b.getInverse( c, true );
  332. assert.ok( false, "Passed!" ); // should never get here.
  333. } catch ( err ) {
  334. assert.ok( true, "Passed!" );
  335. }
  336. var testMatrices = [
  337. new Matrix4().makeRotationX( 0.3 ),
  338. new Matrix4().makeRotationX( - 0.3 ),
  339. new Matrix4().makeRotationY( 0.3 ),
  340. new Matrix4().makeRotationY( - 0.3 ),
  341. new Matrix4().makeRotationZ( 0.3 ),
  342. new Matrix4().makeRotationZ( - 0.3 ),
  343. new Matrix4().makeScale( 1, 2, 3 ),
  344. new Matrix4().makeScale( 1 / 8, 1 / 2, 1 / 3 ),
  345. new Matrix4().makePerspective( - 1, 1, 1, - 1, 1, 1000 ),
  346. new Matrix4().makePerspective( - 16, 16, 9, - 9, 0.1, 10000 ),
  347. new Matrix4().makeTranslation( 1, 2, 3 )
  348. ];
  349. for ( var i = 0, il = testMatrices.length; i < il; i ++ ) {
  350. var m = testMatrices[ i ];
  351. var mInverse = new Matrix4().getInverse( m );
  352. var mSelfInverse = m.clone();
  353. mSelfInverse.getInverse( mSelfInverse );
  354. // self-inverse should the same as inverse
  355. assert.ok( matrixEquals4( mSelfInverse, mInverse ), "Passed!" );
  356. // the determinant of the inverse should be the reciprocal
  357. assert.ok( Math.abs( m.determinant() * mInverse.determinant() - 1 ) < 0.0001, "Passed!" );
  358. var mProduct = new Matrix4().multiplyMatrices( m, mInverse );
  359. // the determinant of the identity matrix is 1
  360. assert.ok( Math.abs( mProduct.determinant() - 1 ) < 0.0001, "Passed!" );
  361. assert.ok( matrixEquals4( mProduct, identity ), "Passed!" );
  362. }
  363. } );
  364. QUnit.test( "scale", ( assert ) => {
  365. assert.ok( false, "everything's gonna be alright" );
  366. } );
  367. QUnit.test( "getMaxScaleOnAxis", ( assert ) => {
  368. var a = new Matrix4().set( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );
  369. var expected = Math.sqrt( 3 * 3 + 7 * 7 + 11 * 11 );
  370. assert.ok( Math.abs( a.getMaxScaleOnAxis() - expected ) <= eps, "Check result" );
  371. } );
  372. QUnit.test( "makeTranslation", ( assert ) => {
  373. assert.ok( false, "everything's gonna be alright" );
  374. } );
  375. QUnit.test( "makeRotationX", ( assert ) => {
  376. assert.ok( false, "everything's gonna be alright" );
  377. } );
  378. QUnit.test( "makeRotationY", ( assert ) => {
  379. assert.ok( false, "everything's gonna be alright" );
  380. } );
  381. QUnit.test( "makeRotationZ", ( assert ) => {
  382. assert.ok( false, "everything's gonna be alright" );
  383. } );
  384. QUnit.test( "makeRotationAxis", ( assert ) => {
  385. var axis = new Vector3( 1.5, 0.0, 1.0 ).normalize();
  386. var radians = _Math.degToRad( 45 );
  387. var a = new Matrix4().makeRotationAxis( axis, radians );
  388. var expected = new Matrix4().set(
  389. 0.9098790095958609, - 0.39223227027636803, 0.13518148560620882, 0,
  390. 0.39223227027636803, 0.7071067811865476, - 0.588348405414552, 0,
  391. 0.13518148560620882, 0.588348405414552, 0.7972277715906868, 0,
  392. 0, 0, 0, 1
  393. );
  394. assert.ok( matrixEquals4( a, expected ), "Check numeric result" );
  395. } );
  396. QUnit.test( "makeScale", ( assert ) => {
  397. assert.ok( false, "everything's gonna be alright" );
  398. } );
  399. QUnit.test( "makeShear", ( assert ) => {
  400. assert.ok( false, "everything's gonna be alright" );
  401. } );
  402. QUnit.test( "compose/decompose", ( assert ) => {
  403. var tValues = [
  404. new Vector3(),
  405. new Vector3( 3, 0, 0 ),
  406. new Vector3( 0, 4, 0 ),
  407. new Vector3( 0, 0, 5 ),
  408. new Vector3( - 6, 0, 0 ),
  409. new Vector3( 0, - 7, 0 ),
  410. new Vector3( 0, 0, - 8 ),
  411. new Vector3( - 2, 5, - 9 ),
  412. new Vector3( - 2, - 5, - 9 )
  413. ];
  414. var sValues = [
  415. new Vector3( 1, 1, 1 ),
  416. new Vector3( 2, 2, 2 ),
  417. new Vector3( 1, - 1, 1 ),
  418. new Vector3( - 1, 1, 1 ),
  419. new Vector3( 1, 1, - 1 ),
  420. new Vector3( 2, - 2, 1 ),
  421. new Vector3( - 1, 2, - 2 ),
  422. new Vector3( - 1, - 1, - 1 ),
  423. new Vector3( - 2, - 2, - 2 )
  424. ];
  425. var rValues = [
  426. new Quaternion(),
  427. new Quaternion().setFromEuler( new Euler( 1, 1, 0 ) ),
  428. new Quaternion().setFromEuler( new Euler( 1, - 1, 1 ) ),
  429. new Quaternion( 0, 0.9238795292366128, 0, 0.38268342717215614 )
  430. ];
  431. for ( var ti = 0; ti < tValues.length; ti ++ ) {
  432. for ( var si = 0; si < sValues.length; si ++ ) {
  433. for ( var ri = 0; ri < rValues.length; ri ++ ) {
  434. var t = tValues[ ti ];
  435. var s = sValues[ si ];
  436. var r = rValues[ ri ];
  437. var m = new Matrix4().compose( t, r, s );
  438. var t2 = new Vector3();
  439. var r2 = new Quaternion();
  440. var s2 = new Vector3();
  441. m.decompose( t2, r2, s2 );
  442. var m2 = new Matrix4().compose( t2, r2, s2 );
  443. /*
  444. // debug code
  445. var matrixIsSame = matrixEquals4( m, m2 );
  446. if ( ! matrixIsSame ) {
  447. console.log( t, s, r );
  448. console.log( t2, s2, r2 );
  449. console.log( m, m2 );
  450. }
  451. */
  452. assert.ok( matrixEquals4( m, m2 ), "Passed!" );
  453. }
  454. }
  455. }
  456. } );
  457. QUnit.test( "makePerspective", ( assert ) => {
  458. assert.ok( false, "everything's gonna be alright" );
  459. } );
  460. QUnit.test( "makeOrthographic", ( assert ) => {
  461. var a = new Matrix4().makeOrthographic( - 1, 1, - 1, 1, 1, 100 );
  462. var expected = new Matrix4().set(
  463. 1, 0, 0, 0,
  464. 0, - 1, 0, 0,
  465. 0, 0, - 2 / 99, - 101 / 99,
  466. 0, 0, 0, 1
  467. );
  468. assert.ok( matrixEquals4( a, expected ), "Check result" );
  469. } );
  470. QUnit.test( "equals", ( assert ) => {
  471. var a = new Matrix4().set( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );
  472. var b = new Matrix4().set( 0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );
  473. assert.notOk( a.equals( b ), "Check that a does not equal b" );
  474. assert.notOk( b.equals( a ), "Check that b does not equal a" );
  475. a.copy( b );
  476. assert.ok( a.equals( b ), "Check that a equals b after copy()" );
  477. assert.ok( b.equals( a ), "Check that b equals a after copy()" );
  478. } );
  479. QUnit.test( "fromArray", ( assert ) => {
  480. assert.ok( false, "everything's gonna be alright" );
  481. } );
  482. QUnit.test( "toArray", ( assert ) => {
  483. var a = new Matrix4().set( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 );
  484. var noOffset = [ 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16 ];
  485. var withOffset = [ undefined, 1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16 ];
  486. var array = a.toArray();
  487. assert.deepEqual( array, noOffset, "No array, no offset" );
  488. var array = [];
  489. a.toArray( array );
  490. assert.deepEqual( array, noOffset, "With array, no offset" );
  491. var array = [];
  492. a.toArray( array, 1 );
  493. assert.deepEqual( array, withOffset, "With array, with offset" );
  494. } );
  495. } );
  496. } );
粤ICP备19079148号