Pointing device sensor component

This component defines nodes to interact with a pointing device (a mouse). TouchSensor allows to catch click events on 3D objects. Drag sensors allow user to edit a transformation of 3D objects: PlaneSensor allows to move objects, SphereSensor allows to rotate objects, and CylinderSensor allows to rotate objects around a constrained axis.

See also X3D specification of the Pointing device sensor component.

Contents:

1. Demos

For demos and tests of these features, see the sensors_pointing_device subdirectory inside our VRML/X3D demo models.

2. Supported nodes

  • TouchSensor(Pascal API: TTouchSensorNode)

    Catch click events on 3D objects. The main functionality is that it sends touchTime event when the user "clicked" the geometry that is sibling to the sensor. See examples/viewport_and_scenes/listen_on_x3d_events/ for a demo how to handle it in Pascal.

    Full support, including:

    • hitTexCoord_changed event. You should apply some texture on your shape, otherwise texture coordinates will not be geneted (and this event will always generate zero vector).

      Note that it's only a single 2D texture coordinate. If you use volumetric 3D textures (from DDS file), the additional texture coordinate components will be ignored. If you use multi-texturing, the additional texture units (above the first) will be ignored.

    • hitNormal_changed event. Generates nice smooth normals when the shape is smooth (e.g. creaseAngle > 0).

      Note: Normals output by hitNormal_changed are in the shape local coordinate system. Spec doesn't say in which coordinate system they should be, please report if you have any idea what is expected / what other browsers do.

  • PlaneSensor(Pascal API: TPlaneSensorNode)

    Move geometry by dragging.

    Note: when axisRotation with non-zero rotation is used, trackPoint_changed is generated in local sensor coordinates (with transformation and axisRotation applied), just like translation_changed.

    Note: that axisRotation is still useful, it is not a shortcut for using Transform with rotation around the sensor. Reason: wrapping sensor in a Transform would change it's siblings. So axisRotation is useful under our interpretation.

  • SphereSensor(Pascal API: TSphereSensorNode)

  • Rotate geometry freely by dragging.

  • CylinderSensor(Pascal API: TCylinderSensorNode)

    Rotate geometry around an axis by dragging.

    Note: See PlaneSensor notes about axisRotation, they apply also here.