{{tag>dragonscript behavior}} [[:start|Start Page]] >> [[main|DragonScript Scripting Language]] >> [[dragengine:modules:dragonscript:abstractions|Abstraction Layers: How you want to build your Game]] >> [[dragengine:modules:dragonscript:behavior_elements|Behavior Elements]] >> **ECBehaviorVRHandPointAt** * [[behaviors_use_cases|Behaviors Explained: By Use-Case]] * [[behaviors_a_to_z|Behaviors Explained: From A to Z]] ====== 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): 3.5 ===== 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): ===== 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): ===== 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): indexFinger ====== 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. ^Parameter^Value^Description^ |interact|string|Interact 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.parameters|string|Optional parameters to use with ''interaction''.| |interactElement.assign|string|Assign point-at element to [[behavior_interactelement|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: ===== 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). ^Parameter^Value^Description^ |enabled|''true'', ''false''|Point-at is enabled| |pointAt|''true'', ''false''|Is pointing at element| |pointAt.distance.less|float|Distance to point-at element is less than value meters| |pointAt.distance.greater|float|Distance to point-at element is greater than value meters| |interact.name|string|Name of interaction| |interact.has|''true'', ''false''|Element is pointed-at and interaction with name ''interaction.name'' is present| |interact.query|''true'', ''false''|Interact 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.parameters|string|Optional 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: true ====== 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. ^Parameter^Value^Description^ |vrHandPointAt.enabled|''true'', ''false''|Point-at is enabled| |vrHandPointAt.pointAt|''true'', ''false''|Is pointing at element| |vrHandPointAt.pointAt.distance.less|float|Distance to point-at element is less than value meters| |vrHandPointAt.pointAt.distance.greater|float|Distance to point-at element is greater than value meters| |vrHandPointAt.interact.name|string|Name of interaction| |vrHandPointAt.interact.has|''true'', ''false''|Element is pointed-at and interaction with name ''interaction.name'' is present| |vrHandPointAt.interact.query|''true'', ''false''|Interact 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.parameters|string|Optional parameters to use with ''interaction.query''.| This is an example of using this condition: true vrHandPointAt.check ====== State Machine Actions ====== Same as [[#behavior_tree_actions|Behavior Tree Actions]]. ====== State Machine Conditions ====== Same as [[#behavior_tree_conditions|Behavior Tree 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 ====== * [[behavior_vrhand|ECBehaviorVRHand]] ====== Optional Behaviors ====== * [[behavior_behaviortree|ECBehaviorBehaviorTree]]: Add actions and conditions for behavior trees to use. * [[behavior_statemachine|ECBehaviorStateMachine]]: Add actions and conditions for state machine to use and events to send to the state machine. ====== Persistency ====== This behavior does support element class to be persistable (setPersistable). ====== API Documentation ====== #@LinkApiDocDEDS2_HTML~classDragengine_1_1Scenery_1_1ECBehaviorVRHand.html,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 #@LinkApiDocDEDS2_HTML~classDragengine_1_1Scenery_1_1BaseVRActorClass.html,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: right 6:0 1 2 3 5 default default value ... ====== Live Examples ====== * [[https://github.com/LordOfDragons/deexamples|DEExamples Repository]]: ExampleVR project.