ARENA AR Builder
An AR/VR capable editing tool to create/manipulate/delete ARENA objects. See top-level Python documentation for requirements. This tool uses the ARENA Persistence Database, so all changes are persisted.
Quick Start
- Clone our Python repo https://github.com/arenaxr/arena-py.
- Usage:
arb
takes at minimum one argument, the first one, a scene name (hello
in this example).python3 tools/arb/arb.py hello
- Interact with the tool at https://arenaxr.org/[your username]/hello
Demo Video
Usage
usage: arb.py [-h] [-n NAMESPACE] [-b BROKER] [-p PORT] [-r REALM] [-m MODELS] [-d] scene
ARENA AR Builder.
positional arguments:
scene ARENA scene name
optional arguments:
-h, --help show this help message and exit
-n NAMESPACE, --namespace NAMESPACE
ARENA namespace
-b BROKER, --broker BROKER
MQTT message broker hostname
-p PORT, --port PORT MQTT message broker port
-r REALM, --realm REALM
ARENA realm name
-m MODELS, --models MODELS
JSON GLTF manifest
-d, --debug Debug mode.
EDIT Button
The edit
button will update all objects in the scene with click-listeners, allowing you to target ARB commands to any object. Toggling the edit
button on, updates the scene scene-options
object and will remind you to reload the page for edit mode to fully activate. You may see an orange warning in the upper left that Events Publish Behavior is too high, which is expected and a reminder to toggle the edit
button off, when finished editing the scene with ARB.
Basic Object Manipulation
When you set the mode to None, Rotate, Nudge, Stretch, Scale, you can manipulate objects in various ways.
AR One-Finger, VR Left-Click
- Tap 1 finger with reticle (AR) or cursor (VR) on the cones to activate one-direction granular manipulation.
AR Two-Finger
- Tap and hold 2 thumbs with reticle (AR) on the cones to activate free manipulation along that axis.
- Move the device in AR to position, scale and rotate.
AR Three-Finger
- Tap and hold 2 thumbs and tap 1 more finger to toggle modes: None, Rotate, Nudge, Stretch, Scale.
Control Panel
- VR Mode: Click and hold your mouse to move your camera relative to the panel.
- AR Mode: Move your AR device to move your camera relative to the panel.
- All Modes: Use the lock button to reposition the panel relative to your camera’s rotation.
Button | Type | Description |
---|---|---|
color | action | Allows color select; tap object to color it (default=#ffffff). |
create | action | Allows shape select; tap clipboard object to create it in place (default=sphere). |
delete | action | Tap object to delete it. |
edit | toggle | Turns on click-listeners for every object in the scene via changing the scene-options object. Requires page reload (default=off). |
lamp | toggle | Turn a headlamp on/off (default=off). |
lock | toggle | Off=panel maintains relative world position; On=panel follows camera rotation (default=off). |
model | action | Allows GLTF model select; tap clipboard object to create it in place (default=duck.glb). Models may be imported via the -m argument (see below). |
move | action | Tap an object to show it in the clipboard, tap clipboard object to move it to that place. |
nudge | action | Tap an object to show yellow nudge-lines, then tap a cone to nudge the object in that direction according to selected granularity (default=mm) Allows mm, cm, dm, m granularity. |
occlude | action | Allows occlusion on/off select; tap object to occlude it (default=on). |
parent | action | Allows setting of parent object; first tap the parent object, then tap the child object. |
redpill | toggle | Reveals useful debug data: gridlines on the floor (y=0) can be seen from above and below, occlusion mask will show all occluded objects, object data mouse hover on an object will show its position, rotation, and scale (default=off). |
rename | action | Allows typing a new name; start typing or just tap an object to load the old name into the editor, then tap the object to apply the new name to. |
rotate | action | Tap an object to show orange rotate-lines, then tap a cone to change object rotation according to selected granularity (default=1°). Allows 1°, 5°, 10°, 45°, 90° Euler angle granularity; Additional 6Dof lines will show degree of rotation. |
scale | action | Tap an object to show blue scale-lines, then tap a cone to increase or decrease object scale according to selected granularity (default=mm). |
slider | toggle | Off=Object manipulation via two-finger hold and move camera, On=Object manipulation via two-finger swipe (default=off). |
stretch | action | Allows altering scale in one of 6Dof. |
wall | action | Allows creation of a basic wall 0.1m thick; tap clipboard brick once with your AR device flush with one corner of the wall, and tap the second time at the opposing corner. Three alignment markers will appear for 2 minutes. |
Clipboard
The clipboard is a temporary see-through object floating in front of the user used to show the relative position of placing a future object. It’s also used in AR to have something to fire an event at where no object currently exists.
Construction Cone
There is a small temporary object resting on position 0,0,0 in the shape of a construction cone to mark the origin of the scene. It will be removed when arb
stops running.
Run Options
Importing Models
You can import a json-formatted manifest of GLTF models using the command argument -m to use on the model control panel option. You can write your own, or use the example, arb-manifest.json.
python3 tools/arb/arb.py hello -m arb-manifest.json
Scale varies widely between individual models, so experiment with the best scale to start with.
arb-manifest.json
{
"models": [
{
"name": "avocado",
"url_gltf": "store/models/Avocado.glb",
"scale": 1
},
{
"name": "shuttle",
"url_gltf": "store/models/Shuttle.glb",
"scale": 5
},
{
"name": "duck",
"url_gltf": "store/models/Duck.glb",
"scale": 0.2
},
{
"name": "earth",
"url_gltf": "store/models/Earth.glb",
"scale": 2
},
{
"name": "lantern",
"url_gltf": "store/models/Lantern.glb",
"scale": 0.015
},
{
"name": "camera",
"url_gltf": "store/models/AntiqueCamera.glb",
"scale": 0.05
}
]
}
MQTT Host and Realm
By default all arb
MQTT messages are published to the default message broker and topic (realm and scene you specify) using this scheme:
- default broker:
oz.andrew.cmu.edu
- default topic:
realm/s/[your namespace]/hello
To use your own MQTT message broker (-b) and/or realm (-r):
- custom broker:
arena-west1.conix.io
- custom topic:
foo/s/[your namespace]/hello
python tools/arb/arb.py hello -b arena-west1.conix.io -r foo