aframe-interpolation_from_vle.js 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. /*
  2. The MIT License (MIT)
  3. Copyright (c) 2014-2018 Nikolai Suslov and the Krestianstvo.org project contributors. (https://github.com/NikolaySuslov/livecodingspace/blob/master/LICENSE.md)
  4. */
  5. if (typeof AFRAME === 'undefined') {
  6. throw new Error('Component attempted to register before AFRAME was available.');
  7. }
  8. AFRAME.registerComponent('interpolation', {
  9. schema: {
  10. enabled: { default: true },
  11. deltaPos: { default: 0.001 },
  12. deltaRot: { default: 0.1 }
  13. },
  14. init: function () {
  15. this.driver = vwf.views["vwf/view/aframeComponent"];
  16. this.tickTime = 0;
  17. },
  18. update: function (oldData) {
  19. if (!this.interpolation) {
  20. this.deltaPos = parseFloat(this.data.deltaPos);
  21. this.deltaRot = THREE.Math.degToRad(parseFloat(this.data.deltaRot));
  22. this.enabled = JSON.parse(this.data.enabled);
  23. if (this.enabled) {
  24. }
  25. }
  26. },
  27. /**
  28. * Called when a component is removed (e.g., via removeAttribute).
  29. * Generally undoes all modifications to the entity.
  30. */
  31. remove: function () { },
  32. /**
  33. * Called on each scene tick.
  34. */
  35. tick: function (t, dt) {
  36. if (!this.node) {
  37. let interNode = Object.entries(this.driver.state.nodes).find(el =>
  38. el[1].parentID == this.el.id && el[1].extendsID == "http://vwf.example.com/aframe/interpolation-component.vwf"
  39. );
  40. this.node = this.driver.nodes[interNode[0]];
  41. this.nodeState = interNode[1];
  42. }
  43. if (this.enabled && this.node && this.node.interpolate) {
  44. this.setInterpolatedTransformsNew(dt);
  45. //this.applyViewTransformOverridesNew(timepassed);
  46. //this.setInterpolatedTransforms(dt);
  47. //this.restoreTransforms();
  48. }
  49. },
  50. setInterpolatedTransformsNew: function(deltaTime) {
  51. //deltaTime = Math.min(deltaTime,this.realTickDif)
  52. this.tickTime += deltaTime || 0;
  53. var hit = 0;
  54. while (this.tickTime > 50) {
  55. hit++;
  56. this.tickTime -= 50;
  57. }
  58. var step = (this.tickTime) / (50);
  59. if (hit === 1) {
  60. this.resetInterpolationNew();
  61. }
  62. var lerpStep = Math.min(1, .2 * (deltaTime / 16.6)); //the slower the frames ,the more we have to move per frame. Should feel the same at 60 0r 20
  63. this.interpolateOneNode(lerpStep,step);
  64. },
  65. resetInterpolationNew: function() {
  66. //don't do interpolation for static objects
  67. //if (this.nodes[i].isStatic) continue;
  68. if (this.node.lastTransformStep + 1 < vwf.time()) {
  69. this.node.lastTickTransform = null;
  70. this.node.lastFrameInterp = null;
  71. this.node.thisTickTransform = null;
  72. } else if (this.nodeState) {
  73. if(!this.node.thisTickTransform)
  74. this.node.thisTickTransform = new THREE.Vector3();
  75. this.node.lastTickTransform = (new THREE.Vector3()).copy(this.node.thisTickTransform); //matset(this.nodes[i].lastTickTransform, this.nodes[i].thisTickTransform);
  76. this.node.thisTickTransform = (new THREE.Vector3()).copy(this.nodeState.aframeObj.el.object3D.position)//this.nodeState.gettingProperty('position')); //matset(this.nodes[i].thisTickTransform, this.state.nodes[i].gettingProperty('transform'));
  77. }
  78. },
  79. interpolateOneNode:function(lerpStep,step)
  80. {
  81. //don't do interpolation for static objects
  82. //if (this.nodes[i].isStatic) return;
  83. if(this.node.lastTickTransform && this.node.thisTickTransform) {
  84. var interp = null;
  85. var last = (new THREE.Vector3()).copy(this.node.lastTickTransform);
  86. var now = (new THREE.Vector3()).copy(this.node.thisTickTransform);
  87. if (last && now) {
  88. interp = (new THREE.Vector3()).copy(last); //matset(interp, last);
  89. interp = last.lerp(now, step);
  90. //interp = this.matrixLerp(last, now, step, interp);
  91. this.node.currentTickTransform = (new THREE.Vector3()).copy(this.nodeState.aframeObj.el.object3D.position)//this.nodeState.gettingProperty('position'))//matset(this.nodes[i].currentTickTransform, this.state.nodes[i].gettingProperty('transform'));
  92. if (this.node.lastFrameInterp)
  93. // interp = this.matrixLerp(this.node.lastFrameInterp, now, lerpStep, interp);
  94. interp = this.node.lastFrameInterp.lerp(now, lerpStep);
  95. //this.state.node.setTransformInternal(interp, false);
  96. this.el.object3D.position.set(interp.x, interp.y, interp.z);
  97. this.node.lastFrameInterp = (new THREE.Vector3()).copy(interp) //matset(this.nodes[i].lastFrameInterp || [], interp);
  98. }
  99. }
  100. },
  101. vecCmp: function (a, b, delta) {
  102. let distance = a.distanceTo(b);
  103. if (distance > delta) {
  104. return false;
  105. }
  106. return true;
  107. },
  108. restoreTransforms: function () {
  109. let r = new THREE.Euler();
  110. let rot = r.copy(this.node.interpolate.rotation.selfTick);
  111. if (rot && this.node.needTransformRestore) {
  112. this.el.object3D.rotation.set(rot.x, rot.y, rot.z)
  113. this.node.needTransformRestore = false;
  114. }
  115. },
  116. setInterpolatedTransforms: function (deltaTime) {
  117. var step = (this.node.tickTime) / (this.driver.realTickDif);
  118. step = Math.min(step, 1);
  119. deltaTime = Math.min(deltaTime, this.driver.realTickDif)
  120. this.node.tickTime += deltaTime || 0;
  121. this.interpolatePosition(step);
  122. this.interpolateRotation(step);
  123. },
  124. radians: function (degrees) {
  125. // return degrees * Math.PI / 180.0;
  126. return THREE.Math.degToRad(degrees)
  127. },
  128. interpolateRotation: function (step) {
  129. let last = this.node.interpolate.rotation.lastTick;
  130. let now = this.node.interpolate.rotation.selfTick;
  131. if (last && now) {
  132. let comp = this.vecCmp(last.toVector3(), now.toVector3(), this.deltaRot);
  133. if (!comp) {
  134. // console.log('Last:', last, ' Now: ', now);
  135. let lastV = (new THREE.Quaternion()).setFromEuler(new THREE.Euler(
  136. (last.x),
  137. (last.y),
  138. (last.z), 'YXZ'
  139. ));
  140. let nowV = (new THREE.Quaternion()).setFromEuler(new THREE.Euler(
  141. (now.x),
  142. (now.y),
  143. (now.z), 'YXZ'
  144. ));
  145. let q = new THREE.Quaternion();
  146. let e = new THREE.Euler();
  147. THREE.Quaternion.slerp(lastV, nowV, q, step || 0);
  148. let interp = e.setFromQuaternion(q, 'YXZ');
  149. this.el.object3D.rotation.set(interp.x, interp.y, interp.z);
  150. this.node.needTransformRestore = true;
  151. }
  152. }
  153. },
  154. interpolatePosition: function (step) {
  155. var last = this.node.interpolate.position.lastTick; //this.node.lastTickTransform;
  156. var now = this.node.interpolate.position.selfTick; //Transform;
  157. if (last && now) {
  158. let comp = this.vecCmp(last, now, this.deltaPos);
  159. if (!comp) {
  160. var lastV = (new THREE.Vector3()).copy(last);
  161. var nowV = (new THREE.Vector3()).copy(now);
  162. var interp = lastV.lerp(nowV, step || 0);
  163. //this.el.setAttribute('position',interp);
  164. this.el.object3D.position.set(interp.x, interp.y, interp.z);
  165. this.node.needTransformRestore = true;
  166. }
  167. }
  168. },
  169. pause: function () { },
  170. play: function () { }
  171. });