Proposal: DisplayXR for Twinmotion (architectural visualization, Leia SR tested) #2389
Replies: 1 comment
|
Update: confirmed on the released runtime. Twinmotion 2026.2 Preview (UE 5.7.4) runs in glasses-free 3D on the released runtime (installed v2.53.1, unmodified). The user started it with F10 and confirmed the look on the tested display ("looks good"), using the true-geometry rig from display info (screen plane 2 m into the scene, behind-glass budget 0.42 %). On the released runtime, the 3D takes the whole panel. The in-window 3D view and the live depth control still need the dev drafts (#2332 / #2350) until the shared host library lands. Finding: a legacy app must use a runtime client whose version matches the running service. With a mismatched client (dev v2.53.0-24 against service v2.53.1), Twinmotion's F10 silently does nothing: there are no OpenXR lines in the app log and no error on screen. The launcher now takes Still open:
Expected gaps against the integration checklist:
Code: 🤖 Generated with Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Twinmotion (tested: 2026.2 Preview, Unreal Engine 5.7.4, Windows 11, D3D12) shows glasses-free 3D on DisplayXR through its own OpenXR mode. It's a closed Unreal build with no plug-ins and no scripting, so everything sits outside the app:
XR_RUNTIME_JSON);Leia SR is the tested display. Status text reads "3D active".
Code:
joehillthunder/displayxr-twinmotion@96710db(private, Apache-2.0 + NOTICE).Target class: dedicated 3D window, whole client
In 3D mode (F10), Twinmotion hides its own UI and mirrors one eye over its whole client, so the 3D view is the whole client and there's no viewport rect to track. It can't draw a woven texture into its own viewport. Today's test scaffolding is the overlay embed (#2332) over the client. The target is the shared host library's dedicated 3D window: over the app's whole client, or full screen on a 3D monitor with the UI on a 2D one.
What the shared host library needs to provide for this class
xrCreateSession, plus the 3D window's size so the rig follows resizes.microsoft/motion_controller, and the mouse hand drives its teleport pointer);Display values
Panel size and nominal viewer come from display info (
displayxr-cli status --json,screens[].layout). The named gap is the comfort budget, which isn't in display info, so 0.14 % front / 0.42 % behind are constants (#2388).Depth method: true-geometry rig
convergenceDiopters = 1/g).ipdFactor = K·w·g/(ipd·z)puts infinity exactly at the behind budget K.p(z) = K·(1 − g/z). Architecture scenes are tens of metres deep, so nothing can exceed the behind budget, and only content nearer than 0.75·g crosses the front budget.Measured
Projection atlas, block matching, viewer seated, g = 2 m, K = 0.42 %:
Unreal renders the off-axis true-geometry frustum correctly. On a hybrid-GPU PC, the session runs through the D3D12 → D3D11 reroute. Twinmotion delivers ~29 fps, and the weave's saturation back-off engages.
Omniverse
Twinmotion 2026.2 exports no 3D scene format; glTF/FBX export are on Epic's public roadmap. Two ways to share content, neither tested yet:
Runtime findings
Pending
🤖 Generated with Claude Code
All reactions