Package selection guidance compiled from public package information, community data, and project usage.
The vector_math package provides a comprehensive set of 2D and 3D vector, matrix, and quaternion operations tailored for graphics, animation, and game development. Built by Google, it offers high-performance mathematical utilities optimized for Flutter applications across multiple platforms. The library supports core geometric computations such as dot products, cross products, transformations, and rotations, making it ideal for handling spatial data efficiently. It is lightweight, well-documented, and designed to integrate seamlessly with Flutter's rendering pipeline.
Use cases
2D/3D graphics rendering
Game development
Animation systems
Spatial transformations
Physics simulations
Camera and object positioning
Key features
Support for 2D and 3D vectors and matrices
Quaternion support for 3D rotations
High-performance math operations
Cross-platform compatibility
Clean, intuitive API design
Built-in transformation utilities
Suitable for
Flutter developers working on games
UI animations requiring precise positioning
Augmented reality applications
Graphics-heavy apps
Math-intensive app logic
Considerations
Not intended for general-purpose math
Requires understanding of linear algebra
Limited to geometric operations
No built-in serialization
Best used alongside other math or graphics packages
Original README
Original README snapshot from the linked source repository. Visit the repository for the latest content.
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;.
import'package:vector_math/vector_math.dart';
voidmain() {
Vector3 x = Vector3.zero(); // Zero vectorVector4 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.
import'dart:math';
import'package:vector_math/vector_math.dart';
voidmain() {
// 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
import'dart:math';
import'package:vector_math/vector_math.dart';
voidmain() {
// 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
import'dart:math';
import'package:vector_math/vector_math.dart';
voidmain() {
// 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
import'package:vector_math/vector_math.dart';
voidmain() {
// Define the first box with a minimum and a maximum.Aabb2 aabbOne = Aabb2.minMax(Vector2.zero(), Vector2(4.0, 4.0));
// Define the second boxAabb2 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
import'package:vector_math/vector_math.dart';
voidmain() {
// 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
import'package:vector_math/vector_math.dart';
voidmain() {
// 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)
// 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';
voidmain() {
// 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: