【问题标题】:collision detection using bounding boxes slowing aframe down使用边界框进行碰撞检测会减慢帧速度
【发布时间】:2017-07-08 01:07:51
【问题描述】:

您好,我最近制作了一个组件,用于在原始形状和非原始形状之间进行碰撞检测。我正在使用three.js中提供的边界框碰撞..它工作正常,但是当我将它用于自定义对象时,它会减慢整个体验......请查看我的组件并告诉我有什么问题......

AFRAME.registerComponent('manual-body', {
          matchingElements: function(attribute){
            var matchingElements = [];
            var allElements = document.getElementsByTagName('*');
            for (var i = 0, n = allElements.length; i < n; i++){
              if (allElements[i].getAttribute(attribute) !== null){
                // Element exists with attribute. Add to array.
                matchingElements.push(allElements[i]);
              }
            }
            return matchingElements;
          },
          tick: function(){
            var elements=this.matchingElements('manual-body');
            for(var i=0;i<elements.length;i++){
              if(this.el.id==elements[i].id){
                continue;
              }
              firstBB = new THREE.Box3().setFromObject(elements[i].object3D);
              secondBB = new THREE.Box3().setFromObject(this.el.object3D);
              var collision = firstBB.intersectsBox(secondBB);
              if(collision){
                this.el.emit('collision', {elSource: this.el,elTarget:elements[i]});
              }
            }
          }
        });

您认为延迟的原因可能是什么?是tick函数内部的碰撞逻辑还是别的什么.....

谢谢

【问题讨论】:

  • 通过自定义对象,您的意思是非“四四方方”模型?
  • 通过自定义对象/非原始形状,我的意思是从free3d.com 以 .obj 格式获取的 3d 对象......当将组件与它们连接时,它会减慢体验......跨度>
  • 这可能会发生,因为三在将盒子调整为您的模型时出现问题。你能在模型中创建一个不可见的盒子,并用它做相交检查吗?
  • 如果您要求我检查 3d 对象与其他模型的碰撞,我是否使用原始形状(a-box)与它进行了交集检查,碰撞检测很好.. ...

标签: javascript three.js aframe


【解决方案1】:

THREE.Box3().setFromObject 方法通过遍历模型中的每个顶点来确定边界框。对于复杂模型,运行 tick 中的每一帧的工作量太大。

您可能需要查看aframe-extras sphere-collider 组件,以获得高效、近似的碰撞

【讨论】:

    【解决方案2】:

    我的猜测是,three.js 通过将框边界调整为自定义模型来降低您的网站速度。
    我会在您的模型中手动添加一个框实体:

    <a-entity collada-model="my model">
          <a-box></a-box>
    </a-entity>
    

    并使用其中的框进行碰撞检查。 如果您正在尝试制作某种物理,请尝试 Don McCurdy 的 Cannon.js implementation,因为无需重新发明轮子:P

    更新
    如果您只有 .obj 的问题,并且 collada 没有引起问题,请尝试将 obj 模型转换为 .dae。
    如果您的问题仍然存在,请尝试我的边界覆盖。

    【讨论】:

    • 我尝试使用 dae 对象,即 collada 模型......这些都很好。
    • 所以你只有一些 .obj 的问题?
    • 你知道为什么 obj 不工作吗?如果 obj 可以运行,那就太好了,因为它们现在更常见和可用......
    • 我不知道为什么你的 .obj 有性能问题,但如果同一个模型作为 .obj 和 .dae 的行为不同,这意味着它在将 obj 解析为webGL api
    猜你喜欢
    • 1970-01-01
    • 2015-02-01
    • 2014-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多