virtual-reality - A-Frame 物理系统 : custom physics materials

标签 virtual-reality aframe cannon.js

我使用“A-Frame Physics System”(https://github.com/donmccurdy/aframe-physics-system)在A-Frame中创建了一个场景:

<!DOCTYPE>
<html>
<head>

<script src="aframe.min.js"></script>
<script src="aframe-extras.min.js"></script>
<script src="aframe-physics-system-master/dist/aframe-physics-system.min.js"></script>
</head>

  <a-scene id="myscene" physics>
    <!--CAMERA-->
    <a-entity camera="userHeight: 1.6" look-controls></a-entity>

    <!--BALL1-->
    <a-sphere color="red" radius="0.3" position="5 5 5" dynamic-body></a-sphere>

    <!--BALL2-->
    <a-sphere color="green" radius="0.3" position="6 5 5" dynamic-body></a-sphere>

    <!--GROUND-->
    <a-plane id="ground" height="200" width="200" rotation="-90 0 0" position="0 0 0" metalness="0" roughness="1" static-body></a-plane>

  </a-scene>
</body>
</html>

场景由两个球体和一个平面组成。我希望一个球在击中飞机时比其他球反弹得更多。我从文档中了解到,我们可以使用以下方法更改整个场景的摩擦和恢复等属性:
<a-scene physics="friction: 0.1; restitution: 0.5">
    <!-- ... -->
</a-scene>

但我想要不同领域的不同摩擦和恢复值。请让我知道是否可以在 A-Frame 中使用。提前致谢!

最佳答案

根据physics component documentation :可以通过 CANNON.js JavaScript API 为不同的对象指定不同的碰撞行为。

对于自定义行为,您需要深入了解 Cannon.js documentation并找到您想要的方法和类。尽管如此,实现自定义 Material 是这样的:

  • 大炮物理是在他们自己的 Cannon.world 中计算/制造的
  • Cannon Objecs 有自己的 Material
  • Cannon.ContactMaterial 定义物理,当这些对象相互碰撞/交互时。它需要添加到 Cannon.world 因为它负责物理。

  • 有了这些,您可以开始执行以下操作:
  • 获取 CANNON.world 引用: var world = $('a-scene')[0].systems.physics.world;
  • 创建两个这样的自定义 Material : var firstMaterial = new CANNON.Material("firstMaterial"); var secondMaterial = new CANNON.Material("secondMaterial");
  • 将 Material 应用于 a 框架对象: $('#cannon')[0].body.material=firstMaterial; $('floor')[0].body.material=secondMaterial;
  • 创建接触 Material 并将其添加到世界 var secondCM = new CANNON.ContactMaterial(firstMaterial,secondMaterial, [restitution = 2]); world.addContactMaterial(secondCM);

  • Here你可以找到一个工作 fiddle 。

    关于virtual-reality - A-Frame 物理系统 : custom physics materials,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44590227/

    相关文章:

    android - 在没有解密 key 的情况下从另一个应用程序中受 DRM 保护的应用程序播放 DASH 流媒体视频

    android - Unity3d 中的 Google Cardboard 演示 : How to center a 3D object in your field of vision by double tapping touchscreen?

    aframe - 如何用A型框架制作无限地板?

    javascript - 将鼠标事件绑定(bind)到 a-frame 对象

    javascript - 跨组件中的函数访问事件监听器数据

    javascript - CannonJS 地板。让球粘在地上

    babylonjs - 如何在 Babylon.js 中将重力设置为大球体(行星)的中心?

    javascript - 在 ReactVR 中创建 2D 场景

    qt3d 和 oculus sdk

    javascript - Cannon JS - 启动具有属性的主体后的位置向量 NaN