source: other-projects/playing-in-the-street/summer-2013/trunk/Playing-in-the-Street-WPF/Content/Web/mrdoob-three.js-4862f5f/test/unit/math/Quaternion.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: 5.8 KB
Line 
1/**
2 * @author bhouston / http://exocortex.com
3 */
4
5module( "Quaternion" );
6
7var orders = [ 'XYZ', 'YXZ', 'ZXY', 'ZYX', 'YZX', 'XZY' ];
8var eulerAngles = new THREE.Euler( 0.1, -0.3, 0.25 );
9
10
11
12var qSub = function ( a, b ) {
13 var result = new THREE.Quaternion();
14 result.copy( a );
15
16 result.x -= b.x;
17 result.y -= b.y;
18 result.z -= b.z;
19 result.w -= b.w;
20
21 return result;
22
23};
24
25test( "constructor", function() {
26 var a = new THREE.Quaternion();
27 ok( a.x == 0, "Passed!" );
28 ok( a.y == 0, "Passed!" );
29 ok( a.z == 0, "Passed!" );
30 ok( a.w == 1, "Passed!" );
31
32 a = new THREE.Quaternion( x, y, z, w );
33 ok( a.x === x, "Passed!" );
34 ok( a.y === y, "Passed!" );
35 ok( a.z === z, "Passed!" );
36 ok( a.w === w, "Passed!" );
37});
38
39test( "copy", function() {
40 var a = new THREE.Quaternion( x, y, z, w );
41 var b = new THREE.Quaternion().copy( a );
42 ok( b.x == x, "Passed!" );
43 ok( b.y == y, "Passed!" );
44 ok( b.z == z, "Passed!" );
45 ok( b.w == w, "Passed!" );
46
47 // ensure that it is a true copy
48 a.x = 0;
49 a.y = -1;
50 a.z = 0;
51 a.w = -1;
52 ok( b.x == x, "Passed!" );
53 ok( b.y == y, "Passed!" );
54});
55
56test( "set", function() {
57 var a = new THREE.Quaternion();
58 ok( a.x == 0, "Passed!" );
59 ok( a.y == 0, "Passed!" );
60 ok( a.z == 0, "Passed!" );
61 ok( a.w == 1, "Passed!" );
62
63 a.set( x, y, z, w );
64 ok( a.x == x, "Passed!" );
65 ok( a.y == y, "Passed!" );
66 ok( a.z === z, "Passed!" );
67 ok( a.w === w, "Passed!" );
68});
69
70test( "setFromAxisAngle", function() {
71
72 // TODO: find cases to validate.
73 ok( true, "Passed!" );
74
75 var zero = new THREE.Quaternion();
76
77 var a = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3( 1, 0, 0 ), 0 );
78 ok( a.equals( zero ), "Passed!" );
79 a = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), 0 );
80 ok( a.equals( zero ), "Passed!" );
81 a = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3( 0, 0, 1 ), 0 );
82 ok( a.equals( zero ), "Passed!" );
83
84 var b1 = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3( 1, 0, 0 ), Math.PI );
85 ok( ! a.equals( b1 ), "Passed!" );
86 var b2 = new THREE.Quaternion().setFromAxisAngle( new THREE.Vector3( 1, 0, 0 ), -Math.PI );
87 ok( ! a.equals( b2 ), "Passed!" );
88
89 b1.multiply( b2 );
90 ok( a.equals( b1 ), "Passed!" );
91});
92
93
94test( "setFromEuler/setFromQuaternion", function() {
95
96 var angles = [ new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 1 ) ];
97
98 // ensure euler conversion to/from Quaternion matches.
99 for( var i = 0; i < orders.length; i ++ ) {
100 for( var j = 0; j < angles.length; j ++ ) {
101 var eulers2 = new THREE.Euler().setFromQuaternion( new THREE.Quaternion().setFromEuler( new THREE.Euler( angles[j].x, angles[j].y, angles[j].z, orders[i] ) ), orders[i] );
102 var newAngle = new THREE.Vector3( eulers2.x, eulers2.y, eulers2.z );
103 ok( newAngle.distanceTo( angles[j] ) < 0.001, "Passed!" );
104 }
105 }
106
107});
108
109test( "setFromEuler/setFromRotationMatrix", function() {
110
111 // ensure euler conversion for Quaternion matches that of Matrix4
112 for( var i = 0; i < orders.length; i ++ ) {
113 var q = new THREE.Quaternion().setFromEuler( eulerAngles, orders[i] );
114 var m = new THREE.Matrix4().makeRotationFromEuler( eulerAngles, orders[i] );
115 var q2 = new THREE.Quaternion().setFromRotationMatrix( m );
116
117 ok( qSub( q, q2 ).length() < 0.001, "Passed!" );
118 }
119
120});
121
122test( "normalize/length/lengthSq", function() {
123 var a = new THREE.Quaternion( x, y, z, w );
124 var b = new THREE.Quaternion( -x, -y, -z, -w );
125
126 ok( a.length() != 1, "Passed!");
127 ok( a.lengthSq() != 1, "Passed!");
128 a.normalize();
129 ok( a.length() == 1, "Passed!");
130 ok( a.lengthSq() == 1, "Passed!");
131
132 a.set( 0, 0, 0, 0 );
133 ok( a.lengthSq() == 0, "Passed!");
134 ok( a.length() == 0, "Passed!");
135 a.normalize();
136 ok( a.lengthSq() == 1, "Passed!");
137 ok( a.length() == 1, "Passed!");
138});
139
140test( "inverse/conjugate", function() {
141 var a = new THREE.Quaternion( x, y, z, w );
142
143 // TODO: add better validation here.
144
145 var b = a.clone().conjugate();
146
147 ok( a.x == -b.x, "Passed!" );
148 ok( a.y == -b.y, "Passed!" );
149 ok( a.z == -b.z, "Passed!" );
150 ok( a.w == b.w, "Passed!" );
151});
152
153
154test( "multiplyQuaternions/multiply", function() {
155
156 var angles = [ new THREE.Euler( 1, 0, 0 ), new THREE.Euler( 0, 1, 0 ), new THREE.Euler( 0, 0, 1 ) ];
157
158 var q1 = new THREE.Quaternion().setFromEuler( angles[0], "XYZ" );
159 var q2 = new THREE.Quaternion().setFromEuler( angles[1], "XYZ" );
160 var q3 = new THREE.Quaternion().setFromEuler( angles[2], "XYZ" );
161
162 var q = new THREE.Quaternion().multiplyQuaternions( q1, q2 ).multiply( q3 );
163
164 var m1 = new THREE.Matrix4().makeRotationFromEuler( angles[0], "XYZ" );
165 var m2 = new THREE.Matrix4().makeRotationFromEuler( angles[1], "XYZ" );
166 var m3 = new THREE.Matrix4().makeRotationFromEuler( angles[2], "XYZ" );
167
168 var m = new THREE.Matrix4().multiplyMatrices( m1, m2 ).multiply( m3 );
169
170 var qFromM = new THREE.Quaternion().setFromRotationMatrix( m );
171
172 ok( qSub( q, qFromM ).length() < 0.001, "Passed!" );
173});
174
175test( "multiplyVector3", function() {
176
177 var angles = [ new THREE.Euler( 1, 0, 0 ), new THREE.Euler( 0, 1, 0 ), new THREE.Euler( 0, 0, 1 ) ];
178
179 // ensure euler conversion for Quaternion matches that of Matrix4
180 for( var i = 0; i < orders.length; i ++ ) {
181 for( var j = 0; j < angles.length; j ++ ) {
182 var q = new THREE.Quaternion().setFromEuler( angles[j], orders[i] );
183 var m = new THREE.Matrix4().makeRotationFromEuler( angles[j], orders[i] );
184
185 var v0 = new THREE.Vector3(1, 0, 0);
186 var qv = v0.clone().applyQuaternion( q );
187 var mv = v0.clone().applyMatrix4( m );
188
189 ok( qv.distanceTo( mv ) < 0.001, "Passed!" );
190 }
191 }
192
193});
194
195test( "equals", function() {
196 var a = new THREE.Quaternion( x, y, z, w );
197 var b = new THREE.Quaternion( -x, -y, -z, -w );
198
199 ok( a.x != b.x, "Passed!" );
200 ok( a.y != b.y, "Passed!" );
201
202 ok( ! a.equals( b ), "Passed!" );
203 ok( ! b.equals( a ), "Passed!" );
204
205 a.copy( b );
206 ok( a.x == b.x, "Passed!" );
207 ok( a.y == b.y, "Passed!" );
208
209 ok( a.equals( b ), "Passed!" );
210 ok( b.equals( a ), "Passed!" );
211});
Note: See TracBrowser for help on using the repository browser.