Ara3D.Mathematics is a portable, safe, and efficient 3D math library written in C# targeting .NET Standard 2.0 without any dependencies.
This is a fork of the Math3D repository at Vim.Math3D, which was based on earlier work done at Ara 3D.
Ara3D.Mathematics is compatible with Unity and has been used in production on many different platforms including Windows, Android, iOS, WebGL, and Magic Leap.
There are a few things that we need to do differently than the Vim.Math3D library, motivating this work.
- Extend the number of data-structure and algorithms provided
- Support auto-generation of code in other languages; particularly JavaScript, and GLSL.
- Provide both single and double precision floating point algorithms throughout
- Improve the efficiency of the compiled libraries
To achieve better performance and cross-language code-generation, the core algorithms and data structure are being re-written using the Plato language.
Plato is designed to make it easy to express generic mathematical concepts and algorithms in a manner that is easy to analyze, optimize, and port to different languages and platforms.
The Plato code will then be cross-compiled back to efficient C#.
This library is a work in progress. For now, the Ara3D.Mathematics surface API is quite similar to Vim.Math3D which in turn is similar to System.Numerics and Monogame, which is an open-source rewrite of the XNA library.
The double precision data structures have been temporarily removed, and will be reintroduced once the port to Plato is completed .
The Ara3D.Mathematics design goals remain mostly the same as the Math3D library:
- Portability
- The library must be pure C#
- No unsafe code
- Fixed binary layout of structs in memory
- Double and Single precision implementation of most structures
- Robustness
- Functions are well covered by unit tests
- Functions are easy to read, understand, and verify
- Ease of Use and Discoverability
- Consistent with Microsoft coding styles
- Consistent API with System.Numerics
- Can use fluent syntax (object-oriented "dot" notation)
- No passing of arguments by reference
- Implicit tuple conversions
- Performance
- Excellent performance, but not at cost of readability or discoverability
- Vim.Math3D
- System.Numerics
- SharpDX Mathematics
- MonoGame
- Math.NET Spatial
- Math.NET Numerics
- Unity.Mathematics
- Unity Reference
- Abacus
- Geometry3Sharp
- FNA-XNA
- Stride
- A Vector Type for C# - R Potter via Code Project
- Godot Engine C# Libraries
- GeometRi - Simple and lightweight computational geometry library for .Net
- Veldrid