Please ensure Javascript is enabled for purposes of website accessibility
Powered by Zoomin Software. For more details please contactZoomin

AVEVA™ XR Studio

Viewer with module (FGI) example

  • Last UpdatedOct 02, 2025
  • 2 minute read

Here, the MovableNode, Input, and Navigation modules are combined to provide a starting navigation system.

  • The EngineLoop module is used for performance optimization.

  • The Interaction module, in combination with the Input module, handles all interactions with items and associated events.

  • The PickManager module manages picking information.

In this way, the user is provided a simple way to implement navigation in the project, by simply configuring and tuning module configurations and input, and the modules manage the necessary logic underneath.

Modules.xml

The modules.xml file contains the modules instantiations and some basic routes.

Modules are instantiated inside group elements, to present them hierarchically inside the runtime debug tool, and, in some cases, configurations are overridden.

For example:

  • In the Input module, 17 actions are already defined and useRemoteGestures is set to true when system platform is “win64_cloud”.

  • The MovableNode is set to use simple Camera node for navigation.

  • In the Navigation module, the movable node and speed configurations are initialized, then a route connects the MovableNode output of the MovableNode module to the movableNode input of the Navigation module.

  • In the Interaction module, the interactionMode configuration is set to mouseSelection, which is also the default value.

It is worth noticing that Input module’s configurations default values for the different Axis, already provide WASD navigation.

In order to avoid this, these configurations must be overridden as follows:

Axis0_NegX="{}"

Axis0_PosX="{}"

Axis0_NegY="{}"

Axis0_PosY="{}"

Axis0_NegZ="{}"

Axis0_PosZ="{}"

Routes

Routes are mainly used to connect the actions and axis of the Input modules to the Navigation and Interaction modules to trigger some predefined behavior, as shown below.

<!-- Routes between Input and Navigation modules for Axis0 and Axis1 -->

<route from="input_module.output_Axis0" to="navigation_module.input_axis_0" />

<route from="input_module.output_Axis1" to="navigation_module.input_axis_1" />

<!-- Routes between Input actions and Navigation module behavior-->

<route from="input_module.output_Sprint_pressed" to="navigation_module.input_isSprint" />

<route from="input_module.output_Pan_pressed" to="navigation_module.input_isPan" />

<route from="input_module.output_SelfRotate_pressed" to="navigation_module.input_isSelfRotate" />

<route from="input_module.output_TargetRotate_pressed" to="navigation_module.input_isTargetRotate" />

<route from="input_module.output_ZoomIn_pressed" to="navigation_module.input_isZoomIn" />

<route from="input_module.output_ZoomOut_pressed" to="navigation_module.input_isZoomOut" />

<route from="input_module.output_mouse_scrollWheel_delta" to="navigation_module.input_mouseWheelDelta" />

<route from="input_module.output_Focus_pressed" to="navigation_module.input_focusOnTarget" condition="[@input_module.output_Focus_pressed]"/>

<route from="input_module.output_ZoomTrigger_pressed" to="navigation_module.input_isZoomTrigger"/>

<route from="input_module.output_Crouch_pressed" to="navigation_module.input_isCrouch"/>

<route from="input_module.output_Teleport_pressed" to="navigation_module.input_teleport" condition="[@input_module.output_Teleport_pressed]"/>

<route from="input_module.output_SwitchCameraMode_pressed" to="navigation_module.input_switchCameraMode" condition="[@input_module.output_SwitchCameraMode_pressed]"/>

<!-- Routes between Input actions and Interaction module behavior-->

<route from="input_module.output_ActiveSelection_pressed" to="interaction_module.input_toggleItemSelection" />

<route from="input_module.output_SelectObject_pressed" to="interaction_module.input_performSelection" condition="[@input_module.output_SelectObject_pressed]" />

<route from="input_module.conf_joystickNodeName" to="interaction_module.input_JoystickSensorName" />

<route from="input_module.output_ActiveAction_pressed" to="interaction_module.input_activeAction" />

<route from="input_module.output_NextAction_pressed" to="interaction_module.input_nextAction" />

<route from="input_module.output_PrevAction_pressed" to="interaction_module.input_prevAction" />

Logic

Although the logic for navigation is already internally handled by the module, some actions, like self-rotation, require that you do the following:

  1. Define an action in the Input module.

    actionN_name="SelfRotate" actionN="{dic1={key1=LMOUSE}}”

  2. Properly set the Axis in the Input module,

    Axis1_NegX="{dic1={key1=MMOUSE}}{dic2={key1=LMOUSE}}{dic3={key1=RMOUSE}}{dic4={key1=PINCHROTATE}}"

    Axis1_PosX="{dic1={key1=MMOUSE}}{dic2={key1=LMOUSE}}{dic3={key1=RMOUSE}}{dic4={key1=PINCHROTATE}}"

    Axis1_NegY="{dic1={key1=MMOUSE}}{dic2={key1=LMOUSE}}{dic3={key1=RMOUSE}}"

    Axis1_PosY="{dic1={key1=MMOUSE}}{dic2={key1=LMOUSE}}{dic3={key1=RMOUSE}}"

    Axis1_NegZ="{}"

    Axis1_PosZ="{}"

  3. Create route from the Input to the Navigation modules

    <route from="input_module.output_SelfRotate_pressed"

    to="navigation_module.input_isSelfRotate" />

    <route from="input_module.output_Axis1"

    to="navigation_module.input_axis_1" />

The action enables the selfRotation, whereas Axis1 contains the value used to calculate the movement to be performed.

In This Topic
Related Links
TitleResults for “How to create a CRG?”Also Available in