| [](https://github.com/google/vector_math.dart/actions/workflows/ci.yml) |
| [](https://pub.dev/packages/vector_math) |
| [](https://pub.dev/packages/vector_math/publisher) |
| [](https://coveralls.io/r/google/vector_math.dart?branch=master) |
| |
| ## Introduction |
| |
| A Vector math library for 2D and 3D applications. |
| |
| ## Features |
| |
| * 2D, 3D, and 4D vector and matrix types. |
| * Quaternion type for animating rotations. |
| * Collision detection: AABB, rays, spheres, ... |
| * Utilities like color and common rendering related operations |
| * Flexible getters and setters, for example, ```position.xwz = color.grb;```. |
| * Fully documented. |
| * Well tested. |
| * Heavily optimized. |
| |
| ## Libraries using vector_math |
| |
| * [Flutter](https://github.com/flutter/flutter) |
| * [Flame](https://github.com/flame-engine/flame) |
| |
| ## Examples |
| |
| 1\. Using the GLSL getter and setter syntax. |
| |
| ```dart |
| import 'package:vector_math/vector_math.dart'; |
| |
| void main() { |
| Vector3 x = Vector3.zero(); // Zero vector |
| Vector4 y = Vector4.all(4.0); // Vector with 4.0 in all lanes |
| x.zyx = y.xzz; // Sets z,y,x the values in x,z,z |
| } |
| ``` |
| |
| 2\. Transforming a vector. |
| |
| |
| ```dart |
| import 'dart:math'; |
| import 'package:vector_math/vector_math.dart'; |
| |
| void main() { |
| // Rotation of PI/2 degrees around the Y axis followed by a |
| // translation of (5.0, 2.0, 3.0). |
| Matrix4 T = Matrix4.rotationY(PI * 0.5)..translate(5.0, 2.0, 3.0); |
| // A point. |
| Vector3 position = Vector3(1.0, 1.0, 1.0); |
| // Transform position by T. |
| T.transform3(position); |
| } |
| ``` |
| |
| 3\. Invert a matrix |
| |
| ```dart |
| import 'dart:math'; |
| import 'package:vector_math/vector_math.dart'; |
| |
| void main() { |
| // Rotation of 90 degrees around the Y axis followed by a |
| // translation of (5.0, 2.0, 3.0). |
| Matrix4 T = Matrix4.rotationY(PI * 0.5)..translate(5.0, 2.0, 3.0); |
| // Invert T. |
| T.invert(); |
| // Invert just the rotation in T. |
| T.invertRotation(); |
| } |
| ``` |
| |
| 4\. Rotate a vector using a quaternion |
| |
| ```dart |
| import 'dart:math'; |
| import 'package:vector_math/vector_math.dart'; |
| |
| void main() { |
| // The X axis. |
| Vector3 axis = Vector3(1.0, 0.0, 0.0); |
| // 90 degrees. |
| double angle = PI / 2.0; |
| // Quaternion encoding a 90 degree rotation along the X axis. |
| Quaternion q = Quaternion.axisAngle(axis, angle); |
| // A point. |
| Vector3 point = Vector3(1.0, 1.0, 1.0); |
| // Rotate point by q. |
| q.rotate(point); |
| } |
| ``` |
| |
| 5\. Check if two axis aligned bounding boxes intersect |
| |
| ```dart |
| import 'package:vector_math/vector_math.dart'; |
| |
| void main() { |
| // Define the first box with a minimum and a maximum. |
| Aabb2 aabbOne = Aabb2.minMax(Vector2.zero(), Vector2(4.0, 4.0)); |
| // Define the second box |
| Aabb2 aabbTwo = Aabb2.minMax(Vector2(5.0, 5.0), Vector2(6.0, 6.0)); |
| // Extend the second box to contain a point |
| aabbTwo.hullPoint(Vector2(3.0, 3.0)); |
| // Check if the two boxes intersect, returns true in this case. |
| bool intersect = aabbOne.intersectsWithAabb2(aabbTwo); |
| } |
| ``` |
| |
| 6\. Check where a ray and a sphere intersect |
| |
| ```dart |
| import 'package:vector_math/vector_math.dart'; |
| |
| void main() { |
| // Define a ray starting at the origin and going into positive x-direction. |
| Ray ray = Ray.originDirection(Vector3.zero(), Vector3(1.0, 0.0, 0.0)); |
| // Defines a sphere with the center (5.0 0.0 0.0) and a radius of 2. |
| Sphere sphere = Sphere.centerRadius(Vector3(5.0, 0.0, 0.0), 2.0); |
| // Checks if the ray intersect with the sphere and returns the distance of the |
| // intersection from the origin of the ray. Would return null if no intersection |
| // is found. |
| double distanceFromOrigin = ray.intersectsWithSphere(sphere); |
| // Evaluate the position of the intersection, in this case (3.0 0.0 0.0). |
| Vector3 position = ray.at(distanceFromOrigin); |
| } |
| ``` |
| |
| 7\. Work with colors |
| |
| ```dart |
| import 'package:vector_math/vector_math.dart'; |
| |
| void main() { |
| // Access a build-in color, colors are stored in 4-dimensional vectors. |
| Vector4 red = Colors.red; |
| Vector4 gray = Vector4.zero(); |
| // Convert the red color to a grayscaled color. |
| Colors.toGrayscale(red, gray); |
| // Parse a blue color from a hex string. |
| Vector4 blue = Vector4.zero(); |
| Colors.fromHexString('#0000FF', blue); |
| // Convert the blue color from RGB to HSL. |
| Colors.rgbToHsl(blue, blue); |
| // Reduce the lightness of the color by 50%. |
| blue.z *= 0.5; |
| // Convert the HSL color back to RGB. |
| Colors.hslToRgb(blue, blue); |
| } |
| ``` |
| |
| 8\. Use 64bit float precision (instead of 32bit) |
| |
| ```dart |
| // Use different import statement. |
| // Which is a drop-in replacement for 'package:vector_math/vector_math.dart' |
| import 'package:vector_math/vector_math_64.dart'; |
| void main() { |
| // Types work the same, but using 64 bit storage. |
| Vector3 x = Vector3.zero(); |
| Matrix4 m = Matrix4.identity(); |
| } |
| ``` |
| |
| ## Development |
| |
| To run the unit tests: |
| |
| ``` |
| ~/src/vector_math/> dart test |
| ``` |
| |
| To automatically generate the latest version of `vector_math_64`: |
| |
| ``` |
| ~/src/vector_math/> dart tool/generate_vector_math_64.dart |
| ``` |