javascript - Aframe:平滑位置和旋转?

标签 javascript html aframe ar.js

我一直在尝试使用 Aframe 和 AR.js。对于增强现实应用程序,一个常见的问题是放置在标记上的对象变得相当“紧张”或“不稳定”。我已经对这个问题做了一些研究,看来解决这个问题的一种可能方法是平滑几个帧上的旋转和位置。不幸的是,关于这样做的教程几乎不存在,而且我才刚刚开始掌握 Html/Javascript。

因此我的问题是:您是否知道aframe实体中是否可以有一个函数来提取位置和旋转,平滑它们,然后将它们传递给(我想)使用这些平滑值的子实体用于放置?

<a-entity position="0 0 0" rotation="0 0 0" >
   <a-video Mysmoothingfunction src="#video" width="3.5" height="2"></a-video>
</a-entity>

我可以想象开始可能是这样的:

<script type="text/javascript"> 
   AFRAME.registerComponent("listener", {
    schema : 
    {
        stepFactor : {
            type : "number",
            default : 0.05
        }
    },
   tick: function() {
       this.getProperty("position"); // something like this?
      }
</script>

您知道如何解决这个问题吗?

最佳答案

您的描述听起来像 linear interpolation 。在这里使用它应该很简单:

一旦标记可见,获取之前的视频位置/旋转,并使用实际标记位置/旋转进行近似。然后使用近似值更新视频

近似值应该可以缓解“抖动”。在这种情况下,我将使用 THREE lerp功能。 如果您不熟悉linear interpolation然后将其视为使用线性函数进行近似的方法(这可能非常不精确,但我就是这么想的)。

代码(附加到标记)如下所示:

AFRAME.registerComponent("listener", {
  init: function() {
    this.target = document.querySelector('#target'); // your video
    this.prevPosition = null; // initially there is no position or rotation
    this.prevRotation = null;
  },

  tick: function() {
    if (this.el.object3D.visible) {
      this.target.setAttribute('visible', 'true')

      if(!this.prevPosition && !this.prevRotation) { 
        // there are no values to lerp from - set the initial values
        this.target.setAttribute('position', this.el.getAttribute('position'))
        this.target.setAttribute('rotation', this.el.getAttribute('rotation'))
      } else {
        // use the previous values to get an approximation 
        this.target.object3D.position.lerp(this.prevPosition, 0.1)

        // this (below) may seem ugly, but the rotation is a euler, not a THREE.Vector3, 
        // so to use the lerp function i'm doing some probably unnecessary conversions
        let rot = this.target.object3D.rotation.toVector3().lerp(this.prevRotation, 0.1)
        this.target.object3D.rotation.setFromVector3(rot)
      }
      // update the values
      this.prevPosition = this.el.object3D.position
      this.prevRotation = this.el.object3D.rotation
    } else {
     // the marker dissapeared - reset the values
     this.target.setAttribute('visible', 'false')
     this.prevPosition = null;
     this.prevRotation = null;
   }
  }
})

您可以注意到我设置的是 object3D 的值,而不是官方 API (setAttribute()/getAttribute())。它应该更快,这在 tick() 函数中进行更改时是可取的。

Here是一个小故障(一个盒子被插值,它的移动非常平滑)。

关于javascript - Aframe:平滑位置和旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53380400/

相关文章:

javascript - jQuery UI 自动完成在恰好 2041 条记录后停止工作

javascript - jQuery 不选择选项元素

Three.js如何开启VR立体模式

javascript - 我可以在 PDF 中嵌入 JavaScript 计数器吗?

javascript - 编辑 JSON 文件

html - HTTPS 页面中的 HTTPS iframe 的安全问题

javascript - IE 显示错误,jQuery 错误

aframe - 是否有可用于 A-Frame 的实例组件来优化包含许多重复对象的场景?

aframe - 如何将帧场景嵌入到 div 中

javascript - 内部 html 在 DOM 树中完全渲染后会触发哪个事件?