babylon.oculusTouchController.ts 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. module BABYLON {
  2. export class OculusTouchController extends WebVRController {
  3. private _defaultModel: BABYLON.AbstractMesh;
  4. public onSecondaryTriggerStateChangedObservable = new Observable<ExtendedGamepadButton>();
  5. public onThumbRestChangedObservable = new Observable<ExtendedGamepadButton>();
  6. constructor(vrGamepad) {
  7. super(vrGamepad);
  8. this.controllerType = PoseEnabledControllerType.OCULUS;
  9. }
  10. public initControllerMesh(scene: Scene, meshLoaded?: (mesh: AbstractMesh) => void) {
  11. let meshName = this.hand === 'right' ? 'RightTouch.babylon' : 'LeftTouch.babylon';
  12. SceneLoader.ImportMesh("", "http://yoda.blob.core.windows.net/models/", meshName, scene, (newMeshes) => {
  13. /*
  14. Parent Mesh name: oculus_touch_left
  15. - body
  16. - trigger
  17. - thumbstick
  18. - grip
  19. - button_y
  20. - button_x
  21. - button_enter
  22. */
  23. this._defaultModel = newMeshes[1];
  24. if (meshLoaded) {
  25. meshLoaded(this._defaultModel);
  26. }
  27. this.attachToMesh(this._defaultModel);
  28. });
  29. }
  30. // helper getters for left and right hand.
  31. public get onAButtonStateChangedObservable() {
  32. if (this.hand === 'right') {
  33. return this.onMainButtonStateChangedObservable;
  34. } else {
  35. throw new Error('No A button on left hand');
  36. }
  37. }
  38. public get onBButtonStateChangedObservable() {
  39. if (this.hand === 'right') {
  40. return this.onSecondaryButtonStateChangedObservable;
  41. } else {
  42. throw new Error('No B button on left hand');
  43. }
  44. }
  45. public get onXButtonStateChangedObservable() {
  46. if (this.hand === 'left') {
  47. return this.onMainButtonStateChangedObservable;
  48. } else {
  49. throw new Error('No X button on right hand');
  50. }
  51. }
  52. public get onYButtonStateChangedObservable() {
  53. if (this.hand === 'left') {
  54. return this.onSecondaryButtonStateChangedObservable;
  55. } else {
  56. throw new Error('No Y button on right hand');
  57. }
  58. }
  59. /*
  60. 0) thumb stick (touch, press, value = pressed (0,1)). value is in this.leftStick
  61. 1) index trigger (touch (?), press (only when value > 0.1), value 0 to 1)
  62. 2) secondary trigger (same)
  63. 3) A (right) X (left), touch, pressed = value
  64. 4) B / Y
  65. 5) thumb rest
  66. */
  67. protected handleButtonChange(buttonIdx: number, state: ExtendedGamepadButton, changes: GamepadButtonChanges) {
  68. let notifyObject = state; //{ state: state, changes: changes };
  69. let triggerDirection = this.hand === 'right' ? -1 : 1;
  70. switch (buttonIdx) {
  71. case 0:
  72. this.onPadStateChangedObservable.notifyObservers(notifyObject);
  73. return;
  74. case 1: // index trigger
  75. if (this._defaultModel) {
  76. (<AbstractMesh>(this._defaultModel.getChildren()[3])).rotation.x = -notifyObject.value * 0.20;
  77. (<AbstractMesh>(this._defaultModel.getChildren()[3])).position.y = -notifyObject.value * 0.005;
  78. (<AbstractMesh>(this._defaultModel.getChildren()[3])).position.z = -notifyObject.value * 0.005;
  79. }
  80. this.onTriggerStateChangedObservable.notifyObservers(notifyObject);
  81. return;
  82. case 2: // secondary trigger
  83. if (this._defaultModel) {
  84. (<AbstractMesh>(this._defaultModel.getChildren()[4])).position.x = triggerDirection * notifyObject.value * 0.0035;
  85. }
  86. this.onSecondaryTriggerStateChangedObservable.notifyObservers(notifyObject);
  87. return;
  88. case 3:
  89. if (this._defaultModel) {
  90. if (notifyObject.pressed) {
  91. (<AbstractMesh>(this._defaultModel.getChildren()[1])).position.y = -0.001;
  92. }
  93. else {
  94. (<AbstractMesh>(this._defaultModel.getChildren()[1])).position.y = 0;
  95. }
  96. }
  97. this.onMainButtonStateChangedObservable.notifyObservers(notifyObject);
  98. return;
  99. case 4:
  100. if (this._defaultModel) {
  101. if (notifyObject.pressed) {
  102. (<AbstractMesh>(this._defaultModel.getChildren()[2])).position.y = -0.001;
  103. }
  104. else {
  105. (<AbstractMesh>(this._defaultModel.getChildren()[2])).position.y = 0;
  106. }
  107. }
  108. this.onSecondaryButtonStateChangedObservable.notifyObservers(notifyObject);
  109. return;
  110. case 5:
  111. this.onThumbRestChangedObservable.notifyObservers(notifyObject);
  112. return;
  113. }
  114. }
  115. }
  116. }