Space Building Reference
Getting started with MagicaVoxel
MagicaVoxel is a free 3D pixel art creation tool that can run on Windows and Mac (or under Wine on Linux). It is currently the only way to build content for Cyberdoof.
- First you need to download and install from ephtracy.github.io
- If you are installing on a Mac and experience a blank screen when first opening, follow these instructions to fix
- If you want to jump straight in, download a template space from the publish page, and open it in MagicaVoxel and have a play around
- However, you'll probably want to watch some tutorial videos about how the software works. Check out these awesome tutorials by Pedro Casavecchia
- Once you have something you want to try out in Cyberdoof, click Host Party and under Upload Custom Space select Choose File and browse to your MagicaVoxel project
Building at correct scale
Cyberdoof uses a fixed scale of 10 voxels (volumetric pixel or vx) per meter. This means that a single voxel in your build will be equivalent to 10cm world size.
The maximum build size supported by MagicaVoxel is 2048vx wide by 2048vx deep by 1024vx high. Cyberdoof also supports up to this size, however depending on build density, you may encounter performance issues on builds this size. Please email hello@cyberdoof.com to report any such issues.
Adding video screens and audio sources
To create a screen:
- Create an object inside of MagicaVoxel (using + button in world view)
- Select this object by double-clicking and then change the dimensions of the object and position where you want the screen to be (the actual voxel content will be ignored and replaced with a box with video on all sides)
- Find the object using Project > Show Scene Outline
- Name the object with prefix
video:
followed by whatever you would like the target to be named inside of the Cyberdoof Stream Panel (e.g.video:Main Screen
)
Adding an audio source is very similar:
- Name the object with prefix
audio:
followed by whatever you would like the target to be named inside of the Cyberdoof Stream Panel (e.g.audio:Stage
) - Unlike a video target, this object will render normally, except you will be able to stream spatial audio from the position. You can choose to leave it empty or make an object design that represents an audio source (e.g. speaker)
Lighting and atmosphere
Cyberdoof tries to match the sky, sun position and lighting of your MagicaVoxel scene as much as possible. However, since they use very different rendering systems, there will be a number of differences that will require experimentation to get just right.
The following environment and scene options are supported:
- Sun Angle and Intensity
- Sky modes Uniform (intensity and color) and Atmospheric Scattering (Rayleigh and Mie options, but currently not color or ozone)
- Display Settings > Ground Color and Ground Material (Alt+Click on ground in Render Mode to edit material)
- Fog Density (this effect is quite different in Cyberdoof, so you'll need to experiment to get the desired result in your space)
- Color palette materials Metal and Glass materials have limited support (the individual settings don't do anything right now, but selecting metal will make things shiny and glass will make it semi-transparent)
- If ground material is set to Metal, the ground will be rendered and treated as water (including ripples, reflection and swimming avatars)
Emissive materials cast light much like they do in MagicaVoxels and you can set the brightness of the light source using Emission option. However there are some major differences:
- Cyberdoof uses a simplified lightfield model where light has volume but not direction (whereas MagicaVoxel does full raytracing for all emissive materials).
- The power (radiant flux) option functions as a control of how far the light will travel (whereas in MagicaVoxel it's an exponential multiplier of the emission value)
If you want to add a little extra atmosphere, you can use the Haze object. Add an empty object to your scene, name starting with haze:
(e.g. haze:foggy area
) and position/size the object to your desired area.
On the other hand, if an area is getting too much sunlight, you can add a density volume to reduce the amount of sunlight an area receives. Add an empty object to your scene, name starting with volume/density:
(e.g. volume/density:foggy area
) and position/size the object to your desired area.
Controlling where avatars spawn
By default avatars will spawn in a random location near the center of your space. However if you prefer, you can use special objects to set locations for avatars to spawn.
- Add a new object to the scene representing the location you would like avatars to spawn
- Find the object using Project > Show Scene Outline
- Name the object
spawn:default
(in the future, you will be able to create named spawn points which can be linked to in the invite URL) - Create as many objects named
spawn:default
as you like -- when people join using the invite link, they will spawn randomly at one of these locations
Making interactive and wearable items
Turning an object into an item is much like adding other types of special objects:
- Find the object using Project > Show Scene Outline
- If you just want to go with the defaults, add
item:
to the start of the objects name- The text after
item:
will appear to guests when they hover their mouse over the item (e.g.item:Magical Sword
) - this item will attach to your hand by default, but can be moved to head or back
- it will be scaled to half of the voxel size (so it will appear oversized in MagicaVoxel)
- The text after
Add a /type
option to customize the item behavior:
item/stick:
hold the item like a glowstick and wave it arounditem/glove:
item wraps around hand and can be waved arounditem/lantern:
the avatar will hold the item up in front of them like a lanternitem/helmet:
the item will cover the entire head of the avatar like a helmet and be attached to head by defaultitem/face:
the item will attach to the face of the avatar like a mask (and can be placed on walls)item/backpack:
item is attached to avatar's back by default (and can be placed on walls)item/wall:
a regular item but can be attached to wallsitem/fixed:
a regular item but cannot be picked upitem/costume:
attaches to the center of an avatar and can be used to put the avatar inside a larger objectitem/jetpack:
attaches to back by default, emits fire emoji and allows avatars to fly whenspawn=grounded
option activeitem/vehicle:
avatar will sit inside the item (so make it bigger than the avatar) and will be able drive around the space
Items default to 0.5
size, however you can set any scale you want using =SCALE
option
- e.g. if you want to scale to one quarter you would name your object
item=0.25:Display Name
- if you want to set the scale and an item type, you'd do this:
item/lantern=0.1:Display Name
Adding animations
- Open the notes panel by clicking the â–¶ twirl button under Palette on the far left of MagicaVoxel's user interface
- Setup the 8 colors you want as part of your cycle on any row in the palette
- Use these 8 colors as slots in your scene, with each color in the row acting as a step offset in the cycle
- Add a note on the chosen row:
cycle:
cycle in order through your 8 colorsrandom:
cycle randomly through your 8 colorsfreeze:
no animation- these more advanced animations are best used with multiple cycle columns in your scene:
offset:
animates filling all slots with the same color before moving to next color in sequence, best used withchase:
cycles through each slot only allowing one to be emissive at a time (like a light chase)
- If you want to add a fade to the animation:
- add
/fade
for smooth transition between colors (e.g.cycle/fade:
) - or
/ping
for emissive flashing ramp effect (e.g.cycle/ping:
)
- add
- Step duration time defaults to 500 ms, but you can change this adding an
=DURATION
option- e.g.
cycle/fade=2000:
for 2000 ms (2 second) delay between animation steps with fade - e.g.
cycle=50:
for 50 ms (0.05 second) delay between animation steps
- e.g.
Space Interactivity with Object States
You can create states that can be toggled by avatars in your space by clicking specified objects. All objects in a specially named group will show/hide depending on if the state is active.
- place objects inside a group named
state/on:STATE_NAME
to only show when the state is active - place objects inside a group named
state/off:STATE_NAME
to only show when the state is inactive - name an object
button/on=STATE_NAME:BUTTON_NAME
to activate the state namedSTATE_NAME
when used - name an object
button/off=STATE_NAME:BUTTON_NAME
to deactivate the state namedSTATE_NAME
when used - name an object
button/toggle=STATE_NAME:BUTTON_NAME
to toggle the state namedSTATE_NAME
when used
Emoji emitters
Add emoji emitters to your space, create an empty object named emitter=EMOJI_NAME:NAME
where EMOJI_NAME
is the shortcode of the emoji.
You can use emitters in combination with Object States (see above) for momentary effects when a state is toggled on or off.
emitter/puff=EMOJI_NAME:NAME
could be used to create a door closing effectemitter/rush=EMOJI_NAME:NAME
could be used to create a whoosh effect (like an airlock breach)
If the emoji aren't travelling the way you want, rotate the object and the emitter direction should follow.
Optimizing your space
zone/show:ZONE_NAME
any objects inside this group will not be rendered if you are inside of another group (e.g.zone:OTHER_ZONE_NAME
)zone/hidden:ZONE_NAME
any objects inside this group will not be rendered unless you are actually inside the group
And then you can create portal zones to join multiple zones together:
zone/show=OTHER_ZONE_NAME:ZONE_NAME
will link these two zones together, if you are inside one, the other will still be visible.
Customize collisions, climbable surfaces and other special object types
collider:
makes the vox fully solid regardless of what is in it (invisible walls!)no_collider:
makes the entire vox not solid (opposite of collider)climbable:
makes an object's vertical surfaces climbable (good for ladders, vines etc)slippery:
makes any slope on an object unclimbable, the avatar will slide down whenever attempting to walk/jump up surfacehidden:
makes the object invisible in the space (useful for when you want to temporarily hide something in your scene)