VRControls.js 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /**
  2. * @author dmarcos / https://github.com/dmarcos
  3. * @author mrdoob / http://mrdoob.com
  4. */
  5. THREE.VRControls = function ( object, onError ) {
  6. var scope = this;
  7. var vrInputs = [];
  8. function gotVRDevices( devices ) {
  9. for ( var i = 0; i < devices.length; i ++ ) {
  10. if ( devices[ i ] instanceof VRDisplay ||
  11. devices[ i ] instanceof PositionSensorVRDevice ) {
  12. vrInputs.push( devices[ i ] );
  13. }
  14. }
  15. if ( vrInputs.length === 0 ) {
  16. if ( onError ) onError( 'VR inputs not available' );
  17. }
  18. }
  19. if ( navigator.getVRDisplays ) {
  20. navigator.getVRDisplays().then( gotVRDevices );
  21. } else if ( navigator.getVRDevices ) {
  22. // Deprecated API.
  23. navigator.getVRDevices().then( gotVRDevices );
  24. }
  25. // the Rift SDK returns the position in meters
  26. // this scale factor allows the user to define how meters
  27. // are converted to scene units.
  28. this.scale = 1;
  29. this.update = function () {
  30. for ( var i = 0; i < vrInputs.length; i ++ ) {
  31. var vrInput = vrInputs[ i ];
  32. if ( vrInput.getPose ) {
  33. var pose = vrInput.getPose();
  34. if ( pose.orientation !== null ) {
  35. object.quaternion.fromArray( pose.orientation );
  36. }
  37. if ( pose.position !== null ) {
  38. object.position.fromArray( pose.position ).multiplyScalar( scope.scale );
  39. }
  40. } else {
  41. // Deprecated API.
  42. var state = vrInput.getState();
  43. if ( state.orientation !== null ) {
  44. object.quaternion.copy( state.orientation );
  45. }
  46. if ( state.position !== null ) {
  47. object.position.copy( state.position ).multiplyScalar( scope.scale );
  48. }
  49. }
  50. }
  51. };
  52. this.resetSensor = function () {
  53. for ( var i = 0; i < vrInputs.length; i ++ ) {
  54. var vrInput = vrInputs[ i ];
  55. if ( vrInput.resetPose !== undefined ) {
  56. vrInput.resetPose();
  57. } else if ( vrInput.resetSensor !== undefined ) {
  58. // Deprecated API.
  59. vrInput.resetSensor();
  60. } else if ( vrInput.zeroSensor !== undefined ) {
  61. // Really deprecated API.
  62. vrInput.zeroSensor();
  63. }
  64. }
  65. };
  66. this.zeroSensor = function () {
  67. console.warn( 'THREE.VRControls: .zeroSensor() is now .resetSensor().' );
  68. this.resetSensor();
  69. };
  70. this.dispose = function () {
  71. vrInputs = [];
  72. };
  73. };