Aframe动态物体落到Collada静态物体地板上

4
使用aframe和aframe-physics-system,我注意到一个问题,“dynamic-body”会穿过基于Collada的“static-body”。所有的dynamic-body应该在蓝色地板上弹跳,但是在我的情况下,除了球体对象之外,所有的物体都会穿过地板。我不确定为什么。这里是jsfiddle示例:https://jsfiddle.net/9z9e1jtk/
<a-scene fog="type: linear; color: #FFEBDE; far:195" >
    <a-assets>
        <a-asset-item id="ground" src="https://cdn.rawgit.com/7ammer/testfiles/master/aframe-ground-physics/floor.dae"></a-asset-item>
    </a-assets>

     <a-entity camera
        universal-controls
        jump-ability
        kinematic-body
        position="0 2 10">
    </a-entity>

    <a-box color="red"
        dynamic-body
        position="0 10 0"
        height="4"></a-box>

    <a-cylinder color="#ddb424"
       position="-5 10 0"
       dynamic-body></a-cylinder>

    <a-sphere color="#ddb424"
       position="5 5 0"
       dynamic-body></a-sphere>

    <a-entity static-body collada-model="#ground"></a-entity>
</a-scene>

我在这里发布了一个问题:https://github.com/donmccurdy/aframe-physics-system/issues/9,似乎Cannon.js只部分支持Collada模型。请查看链接获取更多详细信息。 - Jammer
1
我回答了你的问题,请在仍然活跃的情况下标记为正确。 :) - pr0cz
2个回答

1
Collada在Aframe版本0.9.0及以上不再受支持。对于那些需要它的人,aframe-extras v.6.0.0及更高版本中实现了支持。参考:https://github.com/aframevr/aframe/issues/3793 您可以使用gltf或aframe实体作为地面。
一个例子:
<a-entity id="ground" geometry="primitive: plane; height: 500; width: 500" material=" opacity:0.0" position="0 0 0" static-body rotation="90 0 0"></a-entity>

重要的是,您需要使用collision-filter。这意味着您为实体声明一个组,并声明它应与哪些实体发生碰撞。使用group:namecollidesWith: groupname来完成此操作。如果您想简化操作,可以为每个应该能够发生碰撞的项目仅声明一个组。因此,您将组名称设置为组1,并让其与组1发生碰撞。

然后看起来像这样:

<a-entity id="ground" geometry="primitive: plane; height: 500; width: 500" material=" opacity:0.0" position="0 0 0" static-body rotation="90 0 0" 
        collision-filter="group: group1; collidesWith: group1"></a-entity>

你的其他实体,如立方体或gltf模型需要获得相同的标签。
<a-box collision-filter="group: group1; collidesWith: group1"> </a-box>

为了使其更加简单,只需声明一个a-mixin元标签并将其传递给每个需要获取碰撞函数的项目即可:
<a-mixin id="collision" dynamic-body collision-filter="group: group1; collidesWith: group1"></a-mixin>

<a-box mixin="collision"></a-box>

<a-entity id="ground" geometry="primitive: plane; height: 500; width: 500" material=" opacity:0.0" position="0 0 0" static-body rotation="90 0 0" 
            mixin="collision"></a-entity>

使用gltf-model执行相同操作(内联示例):
<a-entity dynamic-body gltf-model="url(url/to/gltfmodel.gltf)" mixin="collision"></a-entity>

参考资料:https://github.com/donmccurdy/aframe-physics-system


0

我知道我晚了2年,但是尝试在球体内应用一个次要平面作为更好的物理碰撞器。我会让平面比球体更大,然后将不透明度设置为0%。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接