In immersive VR (the 360-degree 3D view inside the headset) your viewer stands inside the 3D world and sees only 3D objects — the way we see the real world. Anything flat disappears: your web page with its buttons, and your Unreal app's normal 2D menus. This page explains why, and the three ways to give a VR viewer controls they can use.
Most people simply say “VR”. Developers say immersive VR for the full 360-degree 3D view inside the headset: the viewer is inside the whole 3D world and can look all around. This page uses the term because what a viewer can see and use changes completely at that moment.
A headset does not go into immersive VR by itself. When the viewer opens your link in the headset's browser (for example on a Meta Quest), the stream first appears as a normal page in a browser window — the non-immersive mode. Only when the viewer presses the VR button does the headset switch into immersive VR. Where that button is, and how the viewer leaves again, works a little differently on each headset.
| Mode in the headset | What the viewer sees | 2D web page and 2D menus | Can they be used? |
|---|---|---|---|
| Non-immersive (before pressing the VR button) | The stream as a page in a browser window | Visible | Mostly yes, with the controller as a pointer |
| Immersive VR (after pressing it) | The whole 3D world, 360 degrees around the viewer | Not visible | No — and even UI made visible in 3D needs extra work before it can be used |
The 360-degree 3D world cannot show any 2D UI or 2D menus. And when UI is shown there, seeing it does not mean the viewer can use it: using it is a separate piece of work.
When people ask about UI in a streamed app, they usually mean one of three different things. Working messages do not make a button visible, and a visible button is not automatically one you can press. These are three separate things, and each one has to be implemented and handled separately:
| UI | What it is | Where it runs |
|---|---|---|
| Web page UI | The page around the stream: your buttons, forms, comment box, and our player controls | In the viewer's browser |
| In-app UI | The menus your app draws itself: UMG in Unreal, Unity UI in Unity, omni.ui in Omniverse | Inside the app on our server, arriving as part of the video |
| Topic | Non-VR (normal Pixel Streaming) | In immersive VR (360-degree view) | How it is handled in VR |
|---|---|---|---|
| Visibility of the web page UI | Visible | Not visible | Leave VR to see it (way 2), or a VR-aware page (way 3) |
| Visibility of the in-app UI | Visible in the video | Not visible as 2D | Show it as a 3D widget in the world (way 1, Widget Component) |
| Interaction with the web page UI | Mouse, touch, keyboard | Not possible while in VR | Leave VR, use the page, go back in (way 2) |
| Interaction with the in-app UI | Mouse and touch are passed to the app | Needs extra work | A pointer on the controller that acts as the mouse (way 1, Widget Interaction) |
| Messaging between web page and app | Works | Works, unchanged | Nothing to change (details) |
So “do messages still work in VR?” and “can my viewers use my UI in VR?” are different questions. The first is yes, with no work. The second needs the UI to be made visible and usable in the 3D world, as the rest of this page explains.
In a non-VR stream (normal Pixel Streaming), a menu is a flat picture drawn on top of the 3D view. A VR headset draws a separate 3D picture for each eye, so that the world has depth. A flat overlay has no depth, so it cannot be shown correctly to both eyes — Unreal does not draw 2D UI in stereo at all. And while the viewer is inside the headset's immersive VR mode (the 360-degree 3D view inside the headset), the browser page around the stream is not shown either.
| What | Non-VR (normal Pixel Streaming) | In immersive VR (360-degree view) |
|---|---|---|
| Your 3D world | Visible | Visible, all around the viewer |
| Your app's 2D menus (UMG on screen) | Visible | Not visible |
| Your web page (buttons, forms, comment box) | Visible | Not visible |
| Messages between your page and your app | Work | Still work — they travel with the video |
So the messages are not the problem: your page and your app can keep talking in VR. What is missing is a control the viewer can see and press while in the headset. Every control has to become a 3D object — or the viewer has to step out of VR to use it.
Yes. Messages between your web page and your Unreal app travel over the same connection as the video, so they keep working while the viewer is in immersive VR (the 360-degree 3D view inside the headset), exactly as in a non-VR stream. Your page can still send to the app, and the app can still send to your page.
What changes in VR is only what the viewer can see and press: your page's buttons are not visible inside the headset. If you use messages so that viewers can work your UI, the sections below show how to give them UI they can use in VR.
| Way | Work for you | What the viewer does | Best for |
|---|---|---|---|
| 1. 3D UI inside the app (Widget Component) | Unreal work, once | Points the controller at a panel floating in the world and clicks | Controls used often during the visit |
| 2. Step out of VR | None | Leaves immersive VR (the 360-degree view), uses your page, goes back into VR | Rare actions; trying VR quickly |
| 3. A VR-aware web page | Web development | Uses page controls before or between VR sessions | Settings chosen before entering VR |
Unreal solves this with 3D UI: the same UMG widget you already built, shown on a flat panel that is placed in the world instead of on the screen. Two components do it:
Your Unreal menu is a UMG widget — a 2D UI. On its own it can only be drawn flat on the screen, which is why it disappears in immersive VR (the 360-degree 3D view inside the headset). A 3D widget gives that same 2D UI a place in the world. This is what happens, in order:
| Piece | Lives on | What it does |
|---|---|---|
| UMG widget (Widget Blueprint) | Your project, unchanged | The 2D UI: buttons, lists, text |
| Widget Component | An actor placed in the world | Creates the 3D surface and draws the chosen UMG on it, so it can be seen in VR |
| Widget Interaction | The player (motion controller) | The 3D world's mouse: points at the widget and clicks it, so it can be used in VR |
With all three in place, the 2D UI of Unreal — UMG — is available inside immersive VR (the 360-degree 3D view inside the headset). The steps below set it up.
When a button in the 3D panel does something your page needs to know — a comment saved, a finish changed — send the same message to the page that you send today. Messages work in VR exactly as in a non-VR stream, so your page and your back end stay in step even though the viewer used the in-world panel.
The quickest solution needs no work at all. The viewer leaves immersive VR (the 360-degree 3D view inside the headset) — on a Meta Quest by pressing the controller's menu (Meta) button and choosing to exit, or with the browser's own exit control — uses your web page as normal, then enters VR again with the same button they used the first time. The stream keeps running in between.
It works, but every switch takes the viewer out of the experience, so it suits actions that happen rarely: picking a different house, saving a summary at the end. Tell viewers about it on the page, for example “Press the menu button to leave VR and use these controls”.
With our iframe and Web SDK integrations, the page around the stream is yours, so you can shape it for VR viewers: put the choices that matter before the viewer enters VR (house, finish set, starting room) on a clear start screen, and send them to the app as messages before the viewer enters immersive VR (the 360-degree 3D view inside the headset). Controls inside the 360-degree view itself still have to come from the app (way 1) — building 3D controls in the web page is web VR development work.
Because the iframe and the Web SDK leave the page to you, a developer can also build a 3D (WebXR) version of the page's HTML controls. Eagle 3D Streaming does not have a demo of this yet; if we build one, we will publish it here. Today the way we can show you is the 3D widget inside your Unreal app (way 1).
Setting up the VR project itself is covered in Set up a VR project, and testing it in a headset in Test VR locally.
Last updated