A Vector math library for 2D and 3D applications.
- 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.
1. Using the GLSL getter and setter syntax.
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).Matrix4T=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).Matrix4T=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();
}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