Skip to content

Commit 84b2bb3

Browse files
munozcojourdain
authored andcommitted
docs(webxr): add webxr example
1 parent 1f99fd5 commit 84b2bb3

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ The vtkRenderWindow is only used to retrieve the scene data and parameters (colo
121121
By relying on the same vtkRenderWindow, you can easily switch from a `VtkRemoteView` to a `VtkLocalView` or vice-versa.
122122
This component gives you controls on how you want to map mouse interaction with the camera.
123123
The default setting mimic default VTK interactor style so you will rarely have to override to the `interactor_settings`.
124+
The VtkLocalView supports WebXR thanks to the `VtkWebXRHelper` component. Please refer to the examples for details on how to use it.
124125

125126
How to use it?
126127
```````````````````````````````````````````````````````````

examples/vue3/cone-webxr.py

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
from trame.app import get_server
2+
from trame.widgets import vuetify3, vtk as vtk_widgets
3+
from trame.ui.vuetify3 import SinglePageLayout
4+
5+
from vtkmodules.vtkFiltersSources import vtkConeSource
6+
from vtkmodules.vtkRenderingCore import (
7+
vtkRenderer,
8+
vtkRenderWindow,
9+
vtkRenderWindowInteractor,
10+
vtkPolyDataMapper,
11+
vtkActor,
12+
)
13+
14+
# VTK factory initialization
15+
from vtkmodules.vtkInteractionStyle import vtkInteractorStyleSwitch # noqa
16+
import vtkmodules.vtkRenderingOpenGL2 # noqa
17+
18+
# -----------------------------------------------------------------------------
19+
# Trame initialization
20+
# -----------------------------------------------------------------------------
21+
22+
server = get_server()
23+
server.client_type = "vue3"
24+
state, ctrl = server.state, server.controller
25+
26+
state.trame__title = "VTK Local rendering"
27+
state.xr_active = False
28+
29+
DEFAULT_RESOLUTION = 6
30+
31+
# -----------------------------------------------------------------------------
32+
# VTK code
33+
# -----------------------------------------------------------------------------
34+
35+
renderer = vtkRenderer()
36+
renderer.SetBackground(0.0231, 0.4194, 0.5592)
37+
renderWindow = vtkRenderWindow()
38+
renderWindow.AddRenderer(renderer)
39+
renderWindow.OffScreenRenderingOn() # Prevent popup window
40+
41+
renderWindowInteractor = vtkRenderWindowInteractor()
42+
renderWindowInteractor.SetRenderWindow(renderWindow)
43+
renderWindowInteractor.GetInteractorStyle().SetCurrentStyleToTrackballCamera()
44+
45+
cone_source = vtkConeSource()
46+
mapper = vtkPolyDataMapper()
47+
actor = vtkActor()
48+
mapper.SetInputConnection(cone_source.GetOutputPort())
49+
actor.SetMapper(mapper)
50+
renderer.AddActor(actor)
51+
renderer.ResetCamera()
52+
renderWindow.Render()
53+
54+
55+
@state.change("resolution")
56+
def update_cone(resolution=DEFAULT_RESOLUTION, **kwargs):
57+
cone_source.SetResolution(resolution)
58+
ctrl.view_update()
59+
60+
61+
def update_reset_resolution():
62+
state.resolution = DEFAULT_RESOLUTION
63+
64+
65+
def toggle_xr():
66+
if state.xr_active:
67+
ctrl.stop_xr()
68+
else:
69+
ctrl.start_xr(vtk_widgets.VtkWebXRHelper.XrSessionTypes.HmdVR)
70+
71+
72+
with SinglePageLayout(server) as layout:
73+
layout.title.set_text("WebXR Cone")
74+
75+
with layout.toolbar:
76+
vuetify3.VSpacer()
77+
vuetify3.VSlider(
78+
density="compact",
79+
v_model=("resolution", DEFAULT_RESOLUTION),
80+
min=3,
81+
max=60,
82+
step=1,
83+
hide_details=True,
84+
dense=True,
85+
style="max-width: 300px",
86+
)
87+
vuetify3.VDivider(vertical=True, classes="mx-2")
88+
with vuetify3.VBtn(icon=True, click=toggle_xr):
89+
vuetify3.VIcon("mdi-virtual-reality")
90+
91+
with layout.content:
92+
with vuetify3.VContainer(
93+
fluid=True,
94+
classes="pa-0 fill-height",
95+
):
96+
with vtk_widgets.VtkLocalView(renderWindow) as view:
97+
ctrl.view_update = view.update
98+
99+
def on_enter_xr():
100+
state.xr_active = True
101+
102+
def on_exit_xr():
103+
state.xr_active = False
104+
105+
webxr_helper = vtk_widgets.VtkWebXRHelper(
106+
draw_controllers_ray=True, enter_xr=on_enter_xr, exit_xr=on_exit_xr
107+
)
108+
ctrl.start_xr = webxr_helper.start_xr
109+
ctrl.stop_xr = webxr_helper.stop_xr
110+
111+
server.start()

0 commit comments

Comments
 (0)