@geometryzen/newton
A Physics Engine for research and education using Geometric Algebra, and Units of Measure (optional).
The following metrics are supported:
Description | Algebra | class |
---|---|---|
Euclidean 1D | G(1,0) | Engine1 |
Euclidean 2D | G(2,0) | Engine2 |
Euclidean 3D | G(3,0) | Engine3 |
Spacetime 1D | G(1,1) | EngineG11 |
Spacetime 2D | G(2,1) | EngineG21 |
Getting Started
The following code illustrates the basic flow. For working examples see STEMCstudio.
Engine3
Euclidean 3D or G(3,0) Physics engine.
Constructing the core simulation using the This example incorporates units of measure.
import {
Block3,
Engine3,
Geometric3,
Spring
} from '@geometryzen/newton'
//
// Constants
//
const e1 = Geometric3.e1
const e2 = Geometric3.e2
const e3 = Geometric3.e3
const kg = Geometric3.kilogram
const m = Geometric3.meter
const s = Geometric3.second
//
// Initialization
//
const sim = new Engine3()
const Δt = 0.01 * s
//
// Add objects
//
const width = 0.5 * m
const height = 0.1 * m
const depth = 0.5 * m
const block1 = new Block3(width, height, depth)
const block2 = new Block3(width, height, depth)
block1.M = 1 * kg
block2.M = 1 * kg
block1.X = -1.0 * e1 * m
block2.X = +1.0 * e1 * m
sim.addBody(block1)
sim.addBody(block2)
//
// Add forces
//
const spring = new Spring(block1, block2)
spring.restLength = 1 * m
spring.stiffness = 1 * kg / (s * s)
sim.addForceLaw(spring)
spring.attach1 = (block1.width * e1 + 0 * block1.height * e2 + block1.depth * e3) / 2
// Inside animation "loop"
sim.advance(Δt.a, Δt.uom)