Proposal: DisplayXR for ParaView (scientific visualization, Leia SR tested) #2360
Replies: 6 comments
Final update: DisplayXR for ParaViewCode: Where this sits against the architecture directionThe overlay embed this was built and measured on (#2332 view rect, #2350 live depth, #2353 input pass-through) is test scaffolding. No further work is planned on those PRs; they stay as a measurement rig.
Since the proposal
Status
Runtime findings
🤖 Generated with Claude Code |
|
Thanks for the update. Putting each app into one of the two target classes (its own viewport, or a dedicated 3D window), with an explicit list of what it needs from a shared host library, is the right framing. It is the input we're using to design that library. The overlay PRs (#2332, #2350, #2353) stay as measurement rigs, as you say. We'll post the host-library API here for review when there's a first draft. |
Update: ParaView Glance in the DisplayXR BrowserParaView's web viewer, ParaView Glance 4.25 (vtk.js, shipped inside ParaView 6.2 under Why a port was needed. The browser's auto-3D leaves Glance flat ("a WebGL canvas but no supported engine found"): it only recognises three.js and PlayCanvas. How it works:
Measured (installed DisplayXR Browser v1.8.0):
Findings:
Code: Pending: a seated check on the display. 🤖 Generated with Claude Code |
|
The same in-viewport route now runs in 3D Slicer 5.12.4 and ParaView 6.2, on the texture target. There's no OpenXR render window and no SlicerVirtualReality: two off-axis eyes come from plain Measured with a simulated viewer; the seated check is still to come:
Your adapter logic carries over directly: the camera pin (as the model matrix), the true-geometry rig and the comfort solver. On Slicer, your screen-plane solver now drives the rig without ever moving Slicer's camera, and your calibrate-spheres scene is the test oracle. Two app-side lessons:
ParaView: |
|
Addendum (2026-10-27): the pending physical-pad check is done. On the panel with 3D active, an Xbox pad over XInput drove ParaView's own camera: left stick orbits and right stick pans, both at constant distance. The pad was ignored while ParaView wasn't in the foreground. The seated user's verdict was "looks good". Triggers (zoom) and A (reset) are verified headless only. 🤖 Generated with Claude Code |
Seated check: ParaView in its own render view (2026-10-28)ParaView 6.2 now draws its 3D inside its own render view on the texture target, and a seated viewer checked it on the tested display (Leia SR).
Earlier today, the hosting-readiness pass on v2.55.0 also passed. The default launcher from a clean shell loads the Program Files runtime with |
Uh oh!
There was an error while loading. Please reload this page.
Proposal: DisplayXR for ParaView (scientific visualization, Leia SR tested)
I've built DisplayXR for ParaView, which shows ParaView's render view in glasses-free 3D on DisplayXR displays. The 3D sits inside ParaView's own render view, next to the pipeline browser and properties panel. It follows ParaView's camera, and the mouse keeps working as usual. It weaves at the same time as other 3D apps on the panel. It's tested end to end on a Leia SR laptop. I'd like the maintainers to review it, and to add ParaView to DisplayXR's compatible applications: for example as
DisplayXR/displayxr-paraview(experimental), and in a displayxr.org listing once that's hosted and tagged, as with Omniverse in #2331 and 3D Slicer in #2352.Code:
joehillthunder/displayxr-paraview(private for now, Apache-2.0 + NOTICE). @dfattal is invited as a collaborator; personal repos can only grant write. I can add anyone else on the maintainers team.Why ParaView
ParaView is the standard open-source tool for large scientific and engineering data: CFD, simulation, and volume and point-cloud analysis. It's used across national labs, academia and industry. Flow fields, isosurfaces and clipped meshes are hard to read in 2D. A desk-sized glasses-free display adds depth while the pipeline, filters and plots stay readable, and nothing goes on anyone's head.
What it does
ParaView 6.2's Python ships VTK's OpenXR module (
vtkOpenXRRenderWindow, OpenGL,XR_KHR_opengl_enable). It drives that module directly. There's no ParaView rebuild, no plug-in to compile and no renderer fork. ParaView runs as a hosted legacy app. The launcher adds Start 3D / Exit 3D buttons to ParaView's Macros toolbar, and the status reads "3D active".XR_RUNTIME_JSONand leaves the system OpenXR runtime alone.DXR_HOSTED_WINDOW=auto(Proposal: embed hosted windows in the app's own window (DXR_HOSTED_WINDOW, viewer inset, F11) #2332) embeds the woven window over ParaView. A small follower publishes the render view's rect (QVTKOpenGLNativeWidget) asDXR_HostedViewRect, so the 3D covers exactly the render view and follows layout changes.DXR_HOSTED_INPUT=app(draft PR feat(d3d11): DXR_HOSTED_INPUT=app — pass the mouse through an embedded 3D view #2353, stacked on Proposal: embed hosted windows in the app's own window (DXR_HOSTED_WINDOW, viewer inset, F11) #2332):WS_EX_NOACTIVATE/MA_NOACTIVATE, so it never takes focus.SetPhysicalToWorldMatrixwith columnss·[right, up, −dop]of ParaView's camera, mapping the rig's nominal eye (0, 1.6, 0) onto it. The focal point sits on the glass at the size the 2D view shows it. Head tracking adds look-around parallax on top. The mapping must use the nominal eye, not the tracked eye, or the scene swims.DXR_LEGACY_CAMERA_RIGis set as follows:DXR_HostedDepthRelNow, d3d11: live depth for embedded apps via DXR_HostedDepth (slider-ready; stacked on #2332) #2350):paraview_live.usdaand re-exports whenever the visible scene, colouring or time changes./ParaViewdefaultPrim, Y-up from the camera's view-up, and cm.Tested
ParaView 6.2.0 (Windows, Python 3.12) on DisplayXR 2.53.0. That's a dev build with #2332, #2350 and #2353, plus the Leia SR plug-in 2.18.0, on an RTX 5070 Ti and a Leia SR laptop panel (3840 × 2400). Demo: ParaView's
disk_out_ref.ex2(a translucent clipped housing coloured by temperature, plus stream tubes).displayxr_atlas_trigger.paraview) on sim-display, with marker spheres at the front, glass and back of the scene:XR_KHR_opengl_enable) legacy apps — VTK-based ParaView / 3D Slicer, Blender VR #2354, with the GL client compositor route).RenderingOpenXR, and there's no 3D display plug-in there yet.Runtime-side findings (for discussion)
DXR_HOSTED_INPUT=app) fixes this for ParaView and Slicer, and should help any hosted legacy app with its own viewport navigation.qwerty_set_depthcaps convergence viadxr_rig_max_convergence, so the Focus slider can only push the scene back from 0.6 m, not bring it forward. Is that intended for legacy rigs?Asks
DisplayXR/displayxr-paraview(experimental, me as maintainer), and a displayxr.org listing after a tagged release.XR_KHR_opengl_enable) legacy apps — VTK-based ParaView / 3D Slicer, Blender VR #2354 (GL legacy apps on Linux), which would bring ParaView, Slicer and Blender VR to Linux.All reactions