Skip to content

Commit

Permalink
feature: add eulerFromMat4, eulerFromQuaternion
Browse files Browse the repository at this point in the history
  • Loading branch information
0b5vr committed Feb 12, 2022
1 parent 6527523 commit c58c680
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/math/euler/eulerFromMat4.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { eulerFromMat3 } from './eulerFromMat3';
import { mat3FromMat4 } from '../mat3/mat3FromMat4';
import type { EulerOrder } from './EulerOrder';
import type { RawMatrix4 } from '../mat4/RawMatrix4';
import type { RawVector3 } from '../vec3/RawVector3';

/**
* Return a euler angles out of a matrix4.
* Make sure the input matrix is normalized.
*
* @param m An input rotation matrix
* @param order An order of output euler angles. Assume as `XYZ` if not specified
*/
export function eulerFromMat4( m: RawMatrix4, order?: EulerOrder ): RawVector3 {
return eulerFromMat3( mat3FromMat4( m ), order );
}
15 changes: 15 additions & 0 deletions src/math/euler/eulerFromQuaternion.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { eulerFromMat3 } from './eulerFromMat3';
import { mat3FromQuaternion } from '../mat3/mat3FromQuaternion';
import type { EulerOrder } from './EulerOrder';
import type { RawQuaternion } from '../quat/RawQuaternion';
import type { RawVector3 } from '../vec3/RawVector3';

/**
* Return a euler angles out of a quaternion.
*
* @param m An input quaternion
* @param order An order of output euler angles. Assume as `XYZ` if not specified
*/
export function eulerFromQuaternion( m: RawQuaternion, order?: EulerOrder ): RawVector3 {
return eulerFromMat3( mat3FromQuaternion( m ), order );
}
2 changes: 2 additions & 0 deletions src/math/euler/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
export * from './eulerFromMat3';
export * from './eulerFromMat4';
export * from './eulerFromQuaternion';
export * from './EulerOrder';
19 changes: 19 additions & 0 deletions src/math/euler/tests/eulerFromMat4.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import '../../../tests/matchers/toBeCloseToArray';
import { eulerFromMat4 } from '../eulerFromMat4';
import type { RawMatrix4 } from '../../mat4/RawMatrix4';

const mat4X45Y45Z45: RawMatrix4 = [
0.500, 0.500, -0.707, 0.0,
-0.146, 0.854, 0.500, 0.0,
0.854, -0.146, 0.500, 0.0,
0.0, 0.0, 0.0, 1.0,
];

describe( 'eulerFromMat4', () => {
it( 'returns an euler angles out of a matrix4', () => {
const subject = eulerFromMat4( mat4X45Y45Z45, 'XYZ' );
expect( subject ).toBeCloseToArray( [ 0.785, 0.785, 0.785 ] );
} );

// See eulerFromMat3.test.ts for more in-depth test cases
} );
14 changes: 14 additions & 0 deletions src/math/euler/tests/eulerFromQuaternion.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import '../../../tests/matchers/toBeCloseToArray';
import { eulerFromQuaternion } from '../eulerFromQuaternion';
import type { RawQuaternion } from '../../quat/RawQuaternion';

const quatX45Y45Z45: RawQuaternion = [ 0.191, 0.461, 0.191, 0.844 ];

describe( 'eulerFromQuaternion', () => {
it( 'returns an euler angles out of a quaternion', () => {
const subject = eulerFromQuaternion( quatX45Y45Z45, 'XYZ' );
expect( subject ).toBeCloseToArray( [ 0.785, 0.785, 0.785 ] );
} );

// See eulerFromMat3.test.ts for more in-depth test cases
} );

0 comments on commit c58c680

Please sign in to comment.