Skip to content

Stand Alone Mode — E-Learning Lab

Stand Alone Mode is an optional authoring workflow that replaces Vizard Inspector with Blender and targets WebXR / standalone VR headsets (e.g. Meta Quest) instead of a tethered Vizard runtime. All existing Vizard-based workflows are completely unchanged when the flag is False.


Enabling Stand Alone Mode

Open global_config/globalConfig.py and set:

STAND_ALONE_MODE = True

Set it back to False at any time to return to the standard Vizard Inspector workflow.


What Changes When Enabled

1. Blender replaces Vizard Inspector

Any action that would normally open Vizard Inspector now opens Blender instead:

Action Normal mode Stand Alone mode
Double-click environment Opens Inspector Opens in Blender
Double-click scene object Opens Inspector Opens in Blender
Double-click avatar Opens Inspector Opens in Blender
Right-click → Edit Model Opens Inspector Opens in Blender
Preview window Edit button Opens Inspector Opens in Blender

2. .glb / .gltf files are kept as primary assets

When a .glb or .gltf file is dropped into the Environments, Objects, or Avatars asset bins:

  • The .glb/.gltf is kept as the primary asset file.
  • A temporary .osgb is created only to capture the thumbnail screenshot.
  • The .osgb is automatically deleted ~4 seconds after the thumbnail is saved.

In normal mode the original non-OSGB file is deleted after conversion. In Stand Alone mode the original is always preserved.

3. _tag node convention for interactive objects

The Scene Objects panel (the checkboxes for Grabbable, Animate, Visible, etc.) normally scans all group nodes in the loaded Vizard scene. In Stand Alone mode it filters to only nodes whose name ends with _tag.

When authoring a model in Blender, name any object you want to be interactive with a _tag suffix:

Chair_tag        ← will appear in the panel as "Chair_tag", can be marked Grabbable
Lever_tag        ← will appear as "Lever_tag", can be marked Animate
BackgroundWall   ← will NOT appear (no _tag suffix)

Can then check "Grabbable", "Hidden" in the E-Learning Lab GUI


Authoring Workflow

Step 1 — Enable the flag

# global_config/globalConfig.py
STAND_ALONE_MODE = True

Step 2 — Prepare your .glb models in Blender

  • Name any interactive objects with a _tag suffix (e.g. Door_tag, Button_tag).
  • Export as .glb (File → Export → glTF 2.0, format = GLB).

Step 3 — Import models into the E-Learning Lab

Drag .glb files from Windows Explorer onto the Environments or Objects asset bins. The app will:
1. Copy the file to Assets/Environments/ (or Assets/Objects/).
2. Capture a thumbnail (via a temporary .osgb — deleted automatically).
3. Display the model in the gallery with its thumbnail.

Step 4 — Build your sequence

Drag environment thumbnails from the Environments panel onto either:
- The Scenes list (left panel) — adds as a new slide, or replaces the currently-selected blank slide.
- The Preview image (centre area) — same behaviour.

The scene appears in the list and loads in the Vizard preview window. You can then:
- Add Audio, Prompts, Images, Video, or Quiz files to the scene as normal.
- Right-click a scene → Edit in Blender to open the .glb for further editing.
- Use the Scene Objects panel to mark _tag nodes as Grabbable, Animate, or Visible.

Step 5 — Run in WebXR

Click "Run Session" and Choose "Single WebXR"

Usage

The server opens the browser automatically. On a Quest headset, open the URL in the Meta Browser.

What the WebXR runner reads from your project

  • 3D environment for each scene
  • 360 video for scenes named with a 360 suffix (see below)
  • 360 image for scenes named with a 360 suffix
  • Scene order and transition type (Key Press / Timer / Release Object)
  • Grabbable, animate, visible object lists per scene
  • Per-scene audio (.wav, .mp3, .ogg)
  • Whole-sequence background audio
  • Session audio loop setting
  • Immersive-augmented reality

360 media scenes

Scenes whose names end with a recognized suffix are rendered as immersive 360 spheres instead of (or alongside) a .glb model. The media file is looked up in the Videos/ subfolder first, then the project root as a fallback.

Scene name suffix Format Description
_360_stereo Top-Bottom stereo Top half → left eye, bottom half → right eye
_180_stereo Side-by-Side stereo Left half → left eye, right half → right eye
_360 Mono equirectangular Single sphere, both eyes

Supported file formats:

Type Extensions Notes
Video .mp4, .webm Browser-native only — .avi, .mkv, .mov are not supported and will be skipped
Image .jpg, .jpeg, .png, .webp Always supported

A 360 scene does not require a .glb file — the .osgb placeholder that Vizard creates is ignored by the WebXR runner. Scenes with no .glb and no recognised 360 media are skipped with a SKIP message in the console.

On desktop, stereo scenes show the left-eye view. In the headset, each eye receives the correct half of the image automatically via WebXR layer masking.

Accessing from a Quest 3 or other device

The server binds to all network interfaces and automatically launches a Cloudflare HTTPS tunnel if cloudflared is installed. The tunnel URL appears in the console a few seconds after startup — open it in the Meta Browser and tap Enter VR.

One-time install (Windows 11 — winget is built in):

winget install cloudflare.cloudflared --accept-package-agreements --accept-source-agreements

After that, just run the server as normal. No second terminal, no account, no sign-in (press "Run Session" in the E-Learning Lab to start the session where users can connect)

If cloudflared is not installed the server still works locally — it just prints the install hint instead.

Where you're accessing from URL to use VR works?
Same PC http://localhost:8765 Yes
Same WiFi — flat preview only http://192.168.x.x:8765 No (HTTP)
Quest 3 / any network https://xxxxx.trycloudflare.com Yes (HTTPS)

The tunnel URL changes each session (free tier limitation) but no account is required.

Interaction in the headset

Input Action
Right controller squeeze (grip) Next scene
Left controller squeeze (grip) Previous scene
Trigger near a _tag object Grab / release object
Left thumbstick Move forward / back / strafe (relative to head direction)
Right thumbstick left / right Snap-turn 45° left / right (turns in place)
Timer transition Auto-advances after configured duration

Desktop preview (no headset required)

Input Action
W / A / S / D Fly camera
Mouse drag Look around
/ N Next scene
/ P Previous scene

AR mode

Right click on a scene to set in AR Mode


Limitations & Planned Next Steps

  • 360 video formats — Only .mp4 and .webm play in browsers. Existing .avi and .mkv files (e.g. from older Vizard projects) must be converted to .mp4 (e.g. with ffmpeg) for WebXR playback. The Vizard runtime is unaffected and continues to use the original formats.
  • .osgb scenes — Standard (non-Stand Alone) scenes in .osgb format are not loadable by Three.js and will be skipped by the WebXR runner. Only .glb/.gltf scenes and recognised 360 media are served.
  • Multi-user networking — Not yet implemented in the WebXR runner (single-user only).
  • Quiz UI — Not yet implemented in the WebXR runner.