The Volumetric and Implicit extensions, published together as version 1.0 on
13 November 2025, describe what is inside a part and shapes defined by
mathematics rather than triangles. Volumetric uses
http://schemas.3mf.io/3dmanufacturing/volumetric/2022/01 (prefix
v), Implicit http://schemas.3mf.io/3dmanufacturing/implicit/2023/12
(prefix i).
General rules
- Consumers must parse every element; the only one they must actually support is the level set shape.
- A file that uses level sets must list the volumetric extension as required. One that only adds colour, composition or properties may list it as required or recommended.
- When the extension is required, objects, functions, 3D images, volume data and
level sets may appear in
<resources>in any order (relaxing the core’s rule that objects come last), but each must still be defined before it is used. - Every sampled element has a transform from object coordinates into the function’s coordinates: a point (x, y, z) is sampled at T × (x, y, z).
- An undefined function result (for example a division by zero) makes the element
use its
fallbackvalue.
Functions
A function resource has an id (ST_ResourceID, required) and an
optional displayname. It takes inputs and gives named outputs of four
data types: scalar, vector (three numbers), matrix (4×4) and resource ID. There are
three kinds.
v:functionfromimage3d
| Attribute | Type | Use | Default | Meaning |
|---|---|---|---|---|
id | ST_ResourceID | required | Resource ID | |
displayname | string | optional | Name for annotation | |
image3did | ST_ResourceID | required | The image3d sampled, defined earlier | |
valueoffset | double | optional | 0.0 | Added after scaling |
valuescale | double | optional | 1.0 | Sampled value V becomes V × valuescale + valueoffset |
filter | ST_Filter | optional | linear | linear (trilinear between the 8 nearest voxel centres) or nearest (ties go to the lower index) |
tilestyleu, tilestylev, tilestylew | ST_TileStyle | optional | wrap | Outside 0–1: wrap s′ = s − floor(s); mirror s′ = 1 − |s − 2·floor(s/2) − 1|; clamp s′ = min(1, max(0, s)) |
Input: pos (vector), the UVW coordinate, with (0,0,0) at the
left-front-bottom corner of the voxel grid and (1,1,1) at the right-back-top.
Outputs, each 0 to 1 before scaling: color (vector of red, green,
blue), red, green, blue and
alpha (scalars).
i:implicitfunction
A graph of nodes; see Implicit extension below.
Private extension function
A function element from a vendor namespace (with id,
displayname and its namespace), taking a scalar or vector and returning
a scalar or vector. Support is optional.
3D images
| Element | Attribute | Type | Use | Meaning |
|---|---|---|---|---|
v:image3d | id | ST_ResourceID | required | Resource ID; holds one imagestack |
name | string | optional | Name for annotation | |
v:imagestack | rowcount | positive integer | required | Pixel rows of every sheet (V direction) |
columncount | positive integer | required | Pixel columns of every sheet (U direction) | |
sheetcount | positive integer | required | Number of imagesheet children (W direction), indexed from 0 | |
v:imagesheet | path | ST_UriReference | required | Part name of one PNG layer, reached from the model by a 3D Texture relationship |
All sheets share size, pixel layout and bit depth. Each count is at most
10243 and the total voxels at most 10245. Values are
normalised by dividing by 2N−1 for an N-bit
channel. Grey images are read as Y, Y, Y; missing alpha is 1. Sheets are
recommended at /3D/volumetric/image/sheet.png;
16-bit channels are recommended where precision matters, and single-channel images
for level-set data (such as a signed distance field).
v:levelset
A shape, used in an object in place of a mesh: the surface is where the function equals zero, evaluated only inside a closed mesh that bounds it.
| Attribute | Type | Use | Default | Meaning |
|---|---|---|---|---|
functionid | ST_ResourceID | required | The function, which must take a vector input pos | |
channel | xs:QName | required | Name of a scalar output to use | |
transform | ST_Matrix3D | optional | identity | Object to function coordinates |
minfeaturesize | positive number | optional | 0 | Smallest feature to resolve; consumers that cannot should warn |
meshid | ST_ResourceID | required | The mesh that bounds evaluation | |
meshbboxonly | boolean | optional | false | True: bound by the mesh’s bounding box only |
fallbackvalue | ST_Number | optional | 0 | Value where the function is undefined |
volumeid | ST_ResourceID | optional | A volumedata to apply |
v:volumedata
A resource (id required) describing properties inside a shape. A
mesh refers to it with v:volumeid, a level set with
volumeid. It holds at most one color, at most one
composite and up to 231−1 property elements.
The data is clipped to the shape. Where a surface property (from the core or the
Materials extension) disagrees, the surface wins in a layer as thin as possible.
Where objects overlap, only the last object’s volume data applies. Volume data must
not be used on a mesh that another mesh refers to as its original (mirrored)
mesh.
| Element | Attribute | Type | Use | Default | Meaning |
|---|---|---|---|---|---|
v:color | functionid | ST_ResourceID | required | Function giving the colour | |
channel | xs:QName | required | A vector output: x, y, z are linear sRGB red, green, blue, clipped to 0–1 | ||
transform | ST_Matrix3D | optional | Object to function coordinates | ||
minfeaturesize | positive number | optional | 0 | Resolution hint | |
fallbackvalue | ST_Number | optional | 0 | Used for each component where undefined | |
v:composite | basematerialid | ST_ResourceID | required | A basematerials group with as many entries as there are materialmapping children | |
v:materialmapping | functionid | ST_ResourceID | required | Function giving one material’s share | |
channel | xs:QName | required | A scalar output, clamped to 0–1 (negative counts as 0) | ||
transform, minfeaturesize, fallbackvalue | optional | As for colour | |||
v:property | functionid | ST_ResourceID | required | Function giving the value | |
channel | xs:QName | required | Output used; its type is the property’s type | ||
name | xs:QName | required | Property name, prefixed with a declared namespace whose owner defines its meaning and units; unique within the volume data | ||
required | boolean | optional | false | True: consumers that do not understand it must warn | |
transform, fallbackvalue | optional | As for colour |
Material mapping order follows the base material order. Each material’s share at a point is its value divided by the sum of all values there; producers must not let the sum fall below 10−5.
Implicit extension
An i:implicitfunction (attributes id and
displayname) declares its inputs in i:in with
i:scalar, i:vector, i:matrix or
i:resourceid elements (each with an identifier and
optional displayname), then lists nodes, then its outputs in
i:out as references. Every node has an identifier
(letters, digits and underscores; never inputs or
outputs) and an optional displayname, its own
i:in of references and i:out of typed outputs.
| Reference element | Points to |
|---|---|
i:scalarref | A scalar output |
i:vectorref | A vector output |
i:matrixref | A matrix output |
i:resourceref | A resource ID output |
Each reference has an identifier (the input’s name), an optional
displayname and ref in the form
node.output; the function’s own inputs are
inputs.name. The graph must be directed and acyclic, with no
function calling itself directly or through others, and each reference must match
the type of what it points to; otherwise the file is rejected.
<i:implicitfunction id="5" displayname="sphere">
<i:in>
<i:vector identifier="pos"/>
<i:scalar identifier="radius"/>
</i:in>
<i:length identifier="Length_3">
<i:in><i:vectorref identifier="A" ref="inputs.pos"/></i:in>
<i:out><i:scalar identifier="result"/></i:out>
</i:length>
<i:subtraction identifier="Subtraction_4">
<i:in>
<i:scalarref identifier="A" ref="Length_3.result"/>
<i:scalarref identifier="B" ref="inputs.radius"/>
</i:in>
<i:out><i:scalar identifier="result"/></i:out>
</i:subtraction>
<i:out>
<i:scalarref identifier="shape" ref="Subtraction_4.result"/>
</i:out>
</i:implicitfunction>
Native nodes
“Componentwise” nodes accept scalars, vectors or (where marked) matrices, with both inputs of the same type, and work on each component.
| Node | Inputs | Outputs | Meaning |
|---|---|---|---|
constant | none; attribute value | value scalar | A constant number |
constvec | none; attributes x, y, z | vector | A constant vector |
constmat | none; attribute matrix (16 numbers) | matrix | A constant 4×4 matrix |
constresourceid | none; attribute value | value resource ID | A resource ID, such as a mesh or function (one example in the specification writes the attribute as resourceid) |
addition, subtraction, multiplication, division | A, B | result | Componentwise; scalar, vector or matrix |
min, max, pow | A, B | result | Componentwise; scalar, vector or matrix (pow: A to the power B) |
fmod | A, B | result | Remainder as C++ fmod; componentwise, scalar to matrix |
mod | A, B | result | Modulo as GLSL mod (A − B·floor(A/B)); componentwise, scalar to matrix |
atan2 | A, B | result | Two-argument arctangent; scalar or vector |
sin, cos, tan, asin, acos, atan | A | result | Componentwise; scalar or vector |
sinh, cosh, tanh, exp, log, log2, log10, sqrt, abs | A | result | Componentwise; scalar, vector or matrix |
round, ceil, floor, sign, fract | A | result | Componentwise; fract is A − floor(A) |
clamp | A, min, max | result | A limited to min…max; componentwise |
select | A, B, C, D | result | C if A < B, otherwise D; all of one type |
composevector | x, y, z scalars | result vector | Builds a vector |
vectorfromscalar | A scalar | result vector | (A, A, A) |
decomposevector | A vector | x, y, z scalars | Splits a vector |
composematrix | m00 … m33 scalars | result matrix | Builds a matrix from 16 values (row, column) |
matrixfromcolumns | A, B, C, D vectors | matrix | Matrix whose columns are the vectors |
matrixfromrows | A, B, C, D vectors | result | Matrix whose rows are the vectors |
dot | A, B vectors | result scalar | Dot product |
cross | A, B vectors | result vector | Cross product |
matrixvectormultiplication | A matrix, B vector | result vector | A × B (the specification’s overview table calls it matvecmultiplication) |
transpose, inverse | A matrix | result matrix | Transpose; inverse |
length | A vector | result scalar | Length of the vector |
mesh | pos vector, mesh resource ID | distance scalar | Signed distance to a closed mesh |
unsignedmesh | pos, mesh | distance | Unsigned distance to a mesh |
beamlattice | pos, beamlattice resource ID; attribute accuraterange (default 0) | distance | Signed distance to a beam lattice, positive outside; exact within accuraterange of it |
functiongradient | functionID, step, and the called function’s inputs; attributes scalaroutput, vectorinput | vector (normalised), gradient, magnitude | Gradient by central differences of step size step |
normalizedistance | functionID, step, and the called function’s inputs; attributes scalaroutput, vectorinput | result | f(x) / |∇f(x)| |
functioncall | functionID and the called function’s inputs | The called function’s outputs | Calls another function |