Appearance
Geometries
Geometry pipeline
Geometries can be defined as shared resources, and may be defined locally for an element or product, or be generated at run-time for parametric elements.
All Space Graph geometries are described using the components below. A parametric element like a railing generates a set of parametric geometries from its parameters leveraging operators.
The geometry pipeline resolves complex nested geometries, including csg or list & range operators, converting them into a standardized mesh output so they can be visualized or exported.
Coordinate system
Space Graph uses a left-handed coordinate system. Y is up, and positive rotation is counter-clockwise.
Nodes can specify position
, rotation
in degrees and optionally a rotationAxis
.
That way the transform is human readable while still offering full 3d transform capabilities.
jsonc
// Standard transform
{
"position": [0, 0, 0],
"rotation": 0,
// up vector by default if not specified
"rotationAxis": [0, 1, 0]
}
Parametric geometry
geometry:extrusion
Extrusion of a profile with a curve which forms side surfaces and a top and bottom surface. This is the standard geometry for most parametric objects.
json
{
"type": "geometry:extrusion",
"height": 2.4,
"profile": {
"type": "curve:circle",
"radius": 0.8
}
}
geometry:cuboid
6 faces, 3 dimensions, 12 edges, ... a cuboid.
json
{
"type": "geometry:cuboid",
"dimensions": [1, 1, 1.5]
}
geometry:sphere
json
{
"type": "geometry:sphere",
"radius": 1
}
geometry:plane
A simple 2d plane.
json
{
"type": "geometry:plane",
"dimensions": [1, 1.5]
}
Static geometry
geometry:mesh
Mesh geometry described by vertices and their indices. Uvs and material assignments to divided surfaces are also supported.
json
{
"type": "geometry:mesh",
"vertices": [0, 0, 0, 2, 0, 0, 1, 1, 0],
"indices": [0, 1, 2]
}
geometry:uri
References external geometry.
json
{
"type": "geometry:uri",
"uri": "https://storage.archilogic.com/<storage-key>/geometry.data3d.gz.buffer",
"format": "data3d"
}
Curves
Mostly used inside extrusions geometries.
curve:polygon
json
{
"type": "curve:polygon",
"points": [
[0, 0],
[0, 2],
[1, 1]
]
}
curve:rectangle
json
{
"type": "curve:rectangle",
"dimensions": [1, 1]
}
curve:circle
json
{
"type": "curve:circle",
"radius": 1
}
curve:composite
jsonc
{
"type": "curve:composite",
"segments": [] // set of open curves ( line, arc )
}
curve:line
json
{
"type": "curve:line",
"start": [0, 0],
"end": [1, 1]
}
curve:arc
json
{
"type": "curve:arc",
"startAngle": 0,
"endAngle": 90,
"radius": 0.5
}
CSG operators
Constructive solid geometry (CSG) operations allow merging, slicing, or intersecting geometries. This is used for instance to cut openings out of walls.
Geometries can have nested geometries: geometry.geometries = []
Also CSG operators can be used here and further nested.
csg:intersect
json
{
"type": "csg:intersect",
"geometry": "geometry-id"
}
csg:subtract
json
{
"type": "csg:subtract",
"geometry": "geometry-id"
}
csg:union
json
{
"type": "csg:union",
"geometry": "geometry-id"
}
csg:clip
json
{
"type": "csg:clip",
"plane": {
"position": [1, 1, 1],
"normal": [1, 1, 0]
}
}
List and range operators
List and range operators can be used in geometry transforms to place several geometry instances while changing their position
and or rotation
values.
To place a railing pole, for instance, 20 times with 0.1m distance, we can use the vector:range
operator on the position
.
The number:range
operator could be used on the rotation
to give each placed instance a different angle.
json
{
"type": "geometry:cuboid",
"dimensions": [0.02, 1, 0.02],
"position": {
"type": "vector3:range",
"range": {
"start": [0, 0, 0],
"step": [0.1, 0, 0],
"count": 20
}
},
"rotation": 0
}
number:list
json
{
"type": "number:list",
"list": [0, 10, 20, 30, 40]
}
// [0, 10, 20, 30, 40]
number:range
jsonc
{
"type": "number:range",
"range": {
"start": 0,
"step": 0.2,
"count": 5
}
}
// [0, 0.2, 0.4, 0.6, 0.8, 1]
vector3:list
jsonc
{
"type": "vector3:list",
"list": [
[0, 0, 0],
[2, 0, 0],
[2, 0, 2],
[0, 0, 2]
]
}
// [[0, 0, 0], [2, 0, 0], [2, 0, 2], [0, 0, 2]]
vector3:range
jsonc
{
"type": "vector3:range",
"range": {
"start": [0, 0, 0],
"step": [0.2, 0.1, 0],
"count": 3
}
}
// [[0, 0, 0], [0.2, 0.1, 0], [0.4, 0.2, 0], [0.6, 0.2, 0]]