【问题标题】:aframe.io: Animate position of entity on parent changeaframe.io:父更改时实体的动画位置
【发布时间】:2017-03-09 05:30:29
【问题描述】:

在将实体附加到场景中的另一个父级时,我正在尝试为实体的平滑移动设置动画。

有一些插件可以为位置本身的变化设置动画,但不是在位置保持不变但父级发生变化时。

我需要这个,因为我定义了不同的“点”,实体可以在哪里。现在我想把实体放到这些点之一,这样我就不用计算实体的新位置了。如果没有动画,这个概念就完美了。

我当前的动画分辨率如下:

  • 遍历实体的所有当前父级,并对这些元素的位置向量求和
  • 遍历所有的父级和新的父级本身,并对这些元素的位置向量求和
  • 减去两个计算得到的向量
  • 将实体附加到新父级并添加动画,其中from = 结果偏移向量和to="0 0 0"

有效,但在某些帧中元素闪烁,因为它首先附加到新父级(position="0 0 0",所以特别是在新父级上),它被绘制,然后动画以 from 放置开始它在旧位置并将其移回"0 0 0"

我建了一个jsfiddle,显示问题:https://jsfiddle.net/fshqghxt/

有人可以帮我解决这个问题吗?我也对完全不同的概念持开放态度。提前谢谢!

【问题讨论】:

    标签: javascript 3d three.js aframe


    【解决方案1】:

    这会有帮助吗? (基于组件的方法)

    HTML:

    <a-scene>
        <a-sphere position="0 1.25 -5" radius="1.25" color="#EF2D5E"></a-sphere>
        <a-box position="-1 0.5 -3" width="1" height="1" depth="1" color="#4CC3D9" animation="property: position; dir: alternate; loop: true; dur: 1000; to: -1 3 -3; startEvents: moveBox"></a-box>
    <a-cylinder position="1 0.75 -3" radius="0.5" height="1.5" color="#FFC65D"></a-cylinder>
        <a-plane position="0 0 -4" rotation="-90 0 0" width="4" height="4" color="#7BC8A4"></a-plane>
        <a-sky color="#ECECEC"></a-sky>
    </a-scene>
    

    JS:

    document.querySelector('a-box').emit('moveBox');
    

    Fiddle

    【讨论】:

    • 嘿,你的回答是保罗。我昨天试了一下,它给我的方法带来了同样的闪烁问题。 :( 今天我从 aframe.io 切换到了纯 three.js,以便在渲染发生时拥有完全的权力。
    【解决方案2】:

    我今天想出了两个解决方案,效果不错:


    留在 aframe.io

    在 aframe.io 停留期间,这个新概念可以正常工作: * 将元素克隆到当前位置 * 隐藏原始元素 * 将其附加到新的父级并将其位置设置为偏移位置以匹配克隆的元素 * 显示原始元素 * 隐藏克隆的元素 * 开始动画

    这样,在克隆的帮助下就不会闪烁了。

    function animateParentChange(element, newParent) {
      var newParentParents = newParent.add(newParent.parentsUntil('a-scene'));
      var elementParents = element.parentsUntil('a-scene');
    
      var oldVector = sumVectors(elementParents);
      var newVector = sumVectors(newParentParents);
    
      var diff = oldVector.sub(newVector)
    
      var newPosition = vectorToPosition(diff);
      console.log("newPosition", newPosition);
    
      $(element).find('a-animate').remove();
      var tempElement = $(element).clone().appendTo(element.parent());
      $(element).attr('visible', 'false').appendTo(newParent).attr('position', diff.toArray().join(' '));
      $(element).append('<a-animation attribute="position" dur="1000" fill="forwards" from="' + diff.toArray().join(' ') + '" to="0 0 0"></a-animation>');
      $(element).attr('visible', true);
      tempElement.remove();
    }
    

    小提琴:https://jsfiddle.net/5uc1hn63/


    切换到纯三.js

    但我最后真正做的是切换到纯three.js,用javascript生成的对象替换所有aframe.io的东西。

    这样我可以完全控制什么时候渲染。在使用 aframe.io 时,我发现它非常易于使用(与 three.js 相比),但没有我需要的那么灵活。

    我接受必须编写更多代码行,但以灵活性为代价,我认为没关系。

    最后每个人都应该自己考虑,什么对他来说更重要。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 2017-10-28
    相关资源
    最近更新 更多