User Tools

Site Tools


dragengine:modules:dragonscript:behavior_vrhandpointat

ECBehaviorVRHandPointAt

Behavior adding support to VR Hand behavior to know what element they are pointing at.

Behavior uses one collider collision test located attached controller collider facing forward.

If hand component is present and a test bone is set the collision test will be attached to the component bone.

By default the test direction is rotated by -45 degrees along the X axis. This accounts for VR hand controllers typically having their Z axis along the grip direction. This causes the point at detection to point 45 degrees upwards. For easier usage rotating the point at detection direction downwards by 45 degrees helps.

By default point-at is disabled for backwards compatibility.

Instance Counts

This behavior can be added twice to an element to add support for left and right hand controller. Use the behavior identifier to tell them apart.

Element Class Properties

Element class properties have the prefix vrHandPointAt. or vrHandPointAt(id). if id is not empty.

range

Range in meters to test for objects supporting to be pointed at.

  • Full name: vrHandPointAt.range or vrHandPointAt(id).range
  • Type: float
  • Restrictions: At least 0
  • Default Value: 2
  • Example (*.deeclass):
    <float name='vrHandPointAt(right).range'>3.5</float>

origin

Test origin relative to hand controller coordinate system.

  • Full name: vrHandPointAt.origin or vrHandPointAt(id).origin
  • Type: 3-component vector
  • Default value: (0, 0, 0)
  • Example (*.deeclass):
    <vector name='vrHandPointAt(left).origin' x='0' y='0.1' z='0.2'/>

rotation

Test rotation in degrees relative to hand controller coordinate system.

  • Full name: vrHandPointAt.rotation or vrHandPointAt(id).rotation
  • Type: 3-component vector
  • Default value: (0, 0, 0)
  • Example (*.deeclass):
    <vector name='vrHandPointAt(left).rotation' x='45' y='0' z='0'/>

bone

Name of bone in controller model to attach to or empty string to attach to the controller itself.

  • Full name: vrHandPointAt.bone or vrHandPointAt(id).bone
  • Type: string
  • Default Value: empty string
  • Example (*.deeclass):
    <string name='vrHandPointAt(right).bone'>indexFinger</string>

Behavior Tree Actions

This behavior adds these behavior tree actions if behavior tree is present. If behavior has non-empty identifier replace vrHandPointAt with vrHandPointAt(id).

vrHandPointAt.update

Update VR hand point-at.

ParameterValueDescription
interactstringInteract with pointed-at element. If element is absent action fails. Runs interaction with name value. If interaction with name value is absent fails action. If interaction returns false fails action. Otherwise action succeeds.
interact.parametersstringOptional parameters to use with interaction.
interactElement.assignstringAssign point-at element to ECBehaviorInteractElement with identifier matching value string. Action fails if no element is pointed at or interact element behavior is absent

This is an example of using this action:

<action name='vrHandPointAt.set'>
  <parameter name='interactElement.assign'/>
</action>

vrHandPointAt.check

Check one or more VR hand point-at parameters. Action succeeds if all parameter value matches their respective VR hand point-at parameter otherwise action fails. This action is typically used as first action in a sequence to run the sequence only if a VR hand point-at parameter matches (or not).

ParameterValueDescription
enabledtrue, falsePoint-at is enabled
pointAttrue, falseIs pointing at element
pointAt.distance.lessfloatDistance to point-at element is less than value meters
pointAt.distance.greaterfloatDistance to point-at element is greater than value meters
interact.namestringName of interaction
interact.hastrue, falseElement is pointed-at and interaction with name interaction.name is present
interact.querytrue, falseInteract with pointed-at element and test result. Condition is true if element is pointed-at, interaction with name interaction.name is present and interaction returns true. It is recommended to use here only interactions without side effects (hence query interactions).
interact.parametersstringOptional parameters to use with interaction.query.
wait If present action returns BTResult.running instead of BTResult.failed to wait until the checks are all fulfilled

This is an example of using this action:

<sequence>
  <action name='vrHandPointAt.check'>
    <parameter name='enabled'>true</parameter>
  </action>
  <!-- actions here run only if VR hand point-at is enabled -->
</sequence>

Behavior Tree Conditions

This behavior adds these behavior tree conditions if behavior tree is present. If behavior has non-empty identifier replace vrHandPointAt with vrHandPointAt(id).

vrHandPointAt.check

Check one or more VR hand point-at parameters. Conditions returns true if all parameter value match their respective VR hand point-at parameter. This condition is typically used to run an action or sequence of actions as long as VR hand point-at conditions are true.

ParameterValueDescription
vrHandPointAt.enabledtrue, falsePoint-at is enabled
vrHandPointAt.pointAttrue, falseIs pointing at element
vrHandPointAt.pointAt.distance.lessfloatDistance to point-at element is less than value meters
vrHandPointAt.pointAt.distance.greaterfloatDistance to point-at element is greater than value meters
vrHandPointAt.interact.namestringName of interaction
vrHandPointAt.interact.hastrue, falseElement is pointed-at and interaction with name interaction.name is present
vrHandPointAt.interact.querytrue, falseInteract with pointed-at element and test result. Condition is true if element is pointed-at, interaction with name interaction.name is present and interaction returns true. It is recommended to use here only interactions without side effects (hence query interactions).
vrHandPointAt.interact.parametersstringOptional parameters to use with interaction.query.

This is an example of using this condition:

<action name='myAction' id='doing something'>
  <parameter name='vrHandPointAt.enabled'>true</parameter>
  <condition>vrHandPointAt.check</condition>
</action>

State Machine Actions

State Machine Conditions

State Machine Events

This behavior sends these state machine events. If behavior has non-empty identifier replace vrHandPointAt with vrHandPointAt(id).

vrHandPointAt.enabled

VR hand point-at has been enabled.

vrHandPointAt.disabled

VR hand point-at has been disabled.

vrHandPointAt.pointAt

Pointing at an element. Send if pointing at an element when previously not pointing at an element or pointing at a different element.

vrHandPointAt.noPointAt

Not pointing at an element. Send if not pointing at an element when previously has been pointing at an element.

Required Behaviors

Optional Behaviors

Persistency

This behavior does support element class to be persistable (setPersistable).

API Documentation

ECBehaviorVRHand.

Since DragonScript Module Version 1.7

Use Cases

  • Test what objects in the world the player is pointing at

Element Class Example

The following example creates an element class with support to test what element the player is pointing at:

class MyElement extends BehaviorElementClass
   public var ECBehaviorVRPlayspace vrPlayspace
   public var ECBehaviorVRHand vrHandRight
   public var ECBehaviorVRHand vrHandLeft
   public var ECBehaviorVRHandPointAt vrRightHandPointAt
   public var ECBehaviorVRHandPointAt vrLeftHandPointAt
   
   public func new()
      // Create playspace
      vrPlayspace = ECBehaviorVRPlayspace.new(this)
      
      // Create hand controllers. The InputDeviceType indicates what device type
      // to monitor. vrRightHand and vrLeftHand can exist only once
      vrHandRight = ECBehaviorVRHand.new(this, vrPlayspace, InputDeviceType.vrRightHand, "right")
      vrHandLeft = ECBehaviorVRHand.new(this, vrPlayspace, InputDeviceType.vrLeftHand, "left")
      
      // Create point at behavior for each hand. By default the test direction
      // is along the controller Z axis. For common controllers this points
      // along the handle direction which is like holding a sword or similar
      vrRightHandPointAt = ECBehaviorVRHandPointAt.new(this, vrRightHand, "right")
      vrLeftHandPointAt = ECBehaviorVRHandPointAt.new(this, vrLeftHand, "left")
      
      // If you have a ECBehaviorCollider in your element class it is a good idea
      // to ignore this collider. This avoids the point hitting the player body
      // or hands.
      
      // vrRightHandPointAt.setIgnoreCollider(collider)
      // vrLeftHandPointAt.setIgnoreCollider(collider)
  end
end

The BaseVRActorClass provides full VR support including ECBehaviorVRHandPointAt for both hands.

Behavior Factory

Using element class supporting adding behaviors the behavior can be added like this:

<?xml version='1.0' encoding='UTF-8'?>
<elementClass name='MyClass' class='GenericBehaviorElement'>
  <behavior type='ECBehaviorVRPlayspace'/>
  <behavior type='ECBehaviorVRHand' id='right'/>
  <behavior type='ECBehaviorVRHand' id='left'/>
 
  <behavior type='ECBehaviorVRHandPointAt' id='right'>
    <!-- required: use vr hand with id. -->
    <string name='vrHand'>right</string>
 
    <!-- optional: set collision filter. default value '1:0 1 2' which means
                   category BaseGameApp.CollisionFilterBit.dynamic
                   filter BaseGameApp.CollisionFilterBit.geometry,
                          BaseGameApp.CollisionFilterBit.dynamic,
                          BaseGameApp.CollisionFilterBit.actor.
                   format is '', 'category' or 'category:filter' where category and filter
                   are a list of bits to set. -->
    <string name='collisionFilter'>6:0 1 2 3 5</string>
 
    <!-- optional: add behavior trees. default adds all behavior trees. -->
    <list name='behaviorTrees'>
      <string/> <!-- add behavior with empty identifier -->
      <string>default</string> <!-- add behavior with 'default' identifier -->
    </list>
 
    <!-- optional: add state machines. default adds all state machines. -->
    <list name='stateMachines'>
      <string/> <!-- add behavior with empty identifier -->
      <string>default</string> <!-- add behavior with 'default' identifier -->
    </list>
 
    <!-- set element properties. omit property prefix if used inside behavior tag -->
    <string name='.name'>value</string>
  </behavior>
 
  <behavior type='ECBehaviorVRHandPointAt' id='left'>
    ...
  </behavior>
</elementClass>

Live Examples

You could leave a comment if you were logged in.
dragengine/modules/dragonscript/behavior_vrhandpointat.txt · Last modified: 2025/05/14 10:53 by dragonlord