This is a neat library for 3D computer graphics based on geometric algebra for the Rust programing language. Specifically it implements the plane-based projective geometric-algebra aka. the Clifford Algebra with signature P(R*3,0,1). At first this may sound like a strange and esoteric idea to use in contrast to the linear algebra you might already be familiar with. However, one will find it to be a more intuitive and powerful formalism to describe operations for three-dimensional euclidean/flat space.
Let's break down what we mean by plane-based, projective and geometric-algebra in reverse order.
Of the history of mathematics it is often said that it where the Arabs or Indians that discovered the number zero. It might be hard for today's people with all their modern technology to fully appreciate the difficulties of solving quadratic equations using roman numerals. What was life like before GPS and mobile phones? Harder still to fathom that like the mathematicians of old, without the number zero, one is missing some numbers that can make life easier, and one is to take this quite literally.
Most know about Complex numbers as the non-real solution of equation x = √-1. Less known is the non-real solution for x = √1 called the Hyperbolic numbers and the non-real solution for x = √0 called the Dual numbers.
Together the complex numbers p, the hyperbolic numbers q and the dual numbers r describe a space Rp,q,r.
The first thing to realise is that to represent all possible transformations of 3D space one needs an extra 4th dimension.
This library exports the following basic elements:
- Plane: the basis vector from which all other elements are build
- Line: the intersection of two planes
There are two special cases for lines:- Branch, a line through the origin
- Horizon, a line infinitely far away
- Point: the intersection of three planes
- Rotor: a rotation
- Translator: a translation
- Motor: a combination of a Rotor and a Translator
Grade increasing The wedge product ^ (also known as the meet, exterior or outer) is bilinear, anti-symmetric, and extended to be associative. TODO
- meet_plane_branch
- meet_point_line anti_commute, a^b = -b^a associative (a^b)^c = a^(b^c) outer product with itself is 0, squares_to_zero, a ^ a = 0
Grade decreasing a & b = !(!a ^ !b)
(De)similarity measure
ab = a|b + a^b
G3 is an oriented algebra where a plane has two sides, and reflecting a plane with itself result in switching those sides. a(a) = -1
A plane b
perpendicular to a mirror a reflects to itself:
-ab^(-a) = b
a(b) = aba⁻¹
let a:Point = !plane(1.0, 0.0, 0.0, 0.0);
let p:Plane = !point(0.0, 1.0, 0.0)
let l:Line = !line(0.0, 1.0, 0.0, 0.0, 1.0, 0.0)
TODO
- Bivector, community site with more info on geometric algebra including videos, software and a discrord server.
- GA4CS, Geometric Algebra for Computer Science
- Videos:
- Siggraph2019 Geometric Algebra, Talk explaining the why and a bit of the how of GA.
- Software:
- Articles:
- Cheat Sheet
- May the forque be with you: Rigid body dynamics in PGA
- The Geometry of 3DPGA products
- PGA Easy
- Automatic differentiation
- Paper with CGA
- New Developments in Projective Geometric Algebra
- Flectors
- Space & Antispace
- Rational trigonometry via projective geometric algebra
- Alan Macdonald videos
- Geometric Calculus Talk
- Lecture playlist
- TensorFlow-based framework for Geometric Algebra
- QED Prerequisites Geometric Algebra: Introduction and Motivation