diff --git a/lib/src/vector_math/quaternion.dart b/lib/src/vector_math/quaternion.dart index b02aba74..ef17fd0d 100644 --- a/lib/src/vector_math/quaternion.dart +++ b/lib/src/vector_math/quaternion.dart @@ -293,7 +293,7 @@ class Quaternion { /// [axis] of rotation. Vector3 get axis { final den = 1.0 - (_qStorage[3] * _qStorage[3]); - if (den < 0.0005) { + if (den < 0.00002) { // 0-angle rotation, so axis does not matter return Vector3.zero(); } diff --git a/lib/src/vector_math_64/quaternion.dart b/lib/src/vector_math_64/quaternion.dart index 6f428a8c..e4f48424 100644 --- a/lib/src/vector_math_64/quaternion.dart +++ b/lib/src/vector_math_64/quaternion.dart @@ -293,7 +293,7 @@ class Quaternion { /// [axis] of rotation. Vector3 get axis { final den = 1.0 - (_qStorage[3] * _qStorage[3]); - if (den < 0.0005) { + if (den < 1e-9) { // 0-angle rotation, so axis does not matter return Vector3.zero(); } diff --git a/test/quaternion_test.dart b/test/quaternion_test.dart index 3ba0a756..6d014ccf 100644 --- a/test/quaternion_test.dart +++ b/test/quaternion_test.dart @@ -7,6 +7,7 @@ import 'dart:typed_data'; import 'package:test/test.dart'; import 'package:vector_math/vector_math.dart'; +import 'package:vector_math/vector_math_64.dart' as v64; import 'test_utils.dart'; @@ -212,6 +213,18 @@ void testFromTwoVectors() { } } +void testSmallAngleQuaternionAxis() { + final quaternion32 = + Quaternion.axisAngle(Vector3(0.0, 0.0, 1.0), 0.6 * degrees2Radians); + relativeTest(quaternion32.axis, Vector3(0.0, 0.0, 1.0)); + relativeTest(quaternion32.radians, 0.6 * degrees2Radians); + final quaternion64 = + v64.Quaternion.axisAngle(v64.Vector3(0, 0, 1), 0.01 * degrees2Radians); + expect( + quaternion64.axis.relativeError(v64.Vector3(0, 0, 1)), closeTo(0, 1e-5)); + expect(quaternion64.radians, closeTo(0.01 * degrees2Radians, 1e-5)); +} + void main() { group('Quaternion', () { test('Float32List instacing', testQuaternionInstacinfFromFloat32List); @@ -223,5 +236,6 @@ void main() { test('Normalize', testQuaternionNormalize); test('Axis-Angle', testQuaternionAxisAngle); test('Construction from two vectors', testFromTwoVectors); + test('Axis of quaternion from small angle', testSmallAngleQuaternionAxis); }); }