Introduction
Note: This documentation is for the old 0.3.0 version of A-Frame. Check out the documentation for the current 1.6.0 version
Primitives are entities that:
- Have a semantic name (e.g.,
<a-box>
) - Have a preset assemblage of components
- Have default component property values
- Map HTML attributes to component properties
They are a convenience layer on top of the core API and are meant to:
- Pre-compose useful components together with prescribed defaults
- Act as a shorthand for complex-but-common types of entities (e.g.,
<a-sky>
) - Provide a familiar interface with HTML attributes mapping to only a single value
They are sort of like Prefabs in Unity. Some literature on the entity-component-system pattern refer to these as assemblages.
Example
Here is an assortment of various primitives in use:
<a-scene> |
Primitives are Entities
Since every primitive extends <a-entity>
s, things that can be done with
entities can be done with primitives:
- Positioning, rotating, and scaling
- Attaching components and mixins
- Applying animations
For example, let’s take <a-box>
primitive, and say someone writes a
third-party physics component. We can attach it to <a-box>
just as we would
with any entity:
<a-box color="red" physics="mass: 2.4"></a-box> |
How They Work
To create a wide red box using the primitives API, we could write:
<a-box color="red" width="3"></a-box> |
Which ends up expanding to:
<a-box color="red" width="3" geometry="primitive: box; width: 3" material="color: red"></a-box> |
Under the hood, we see that primitives extend <a-entity>
as a custom
element while providing some defaults. It defaults the geometry.primitive
property to box
. And it maps (i.e., proxies) the HTML width
attribute to
the underlying geometry.width
property and the HTML color
attribute to the
underlying material.color
property.
Register a Primitive
We can compose and register our own primitives (i.e., register an element) for other people to easily use.
For example, here is what the registration looks like for <a-box>
primitive:
var extendDeep = AFRAME.utils.extendDeep; |
For example, Don McCurdy’s aframe-extras creates <a-ocean>
primitive using his ocean component:
AFRAME.registerPrimitive('a-ocean', { |
Then we’d be able to create oceans using basic HTML syntax with little configuration needed:
<a-ocean color="aqua" height="100" width="100"></a-ocean> |