🏈
8th Wall/A-frameで物理演算を使う
概要
- 8th Wall/A-frameで物理演算を使う方法を紹介します
- 少し古い記述ではCANNON.jsを使った実装が多いですが、CANNON.jsは将来的に非サポートになるようです
- 今回はCANNON.jsの代わりとなとなるAmmo.jsを使った方法を紹介します
事前準備
まず、Ammo.jsを使えるように読み込みます
8th Wallの場合はhead.html
に記載します
<script src="//cdn.8thwall.com/web/aframe/ammo.wasm.js"></script>
<script src="//cdn.8thwall.com/web/aframe/aframe-physics-system-4.0.1.min.js"></script>
<a-scene>
タグでAmmo.jsを有効にします
<a-scene physics=" driver: ammo; debug: true; debugDrawMode: 1;">
<!-- ... -->
</a-scene>
debug: true
にするとコライダーがどの範囲かなどデバッグ表示をすることができます
表示内容はdebugDrawMode
で切り替えることができます
詳しくは公式のソースコードをご覧ください
シーンのセットアップ
次にシーン上にオブジェクトを設置していきます
物理はammo-body
とammo-shape
のコンポーネントを追加することで動作します
<a-sphere
position="0 3 0"
color="red"
ammo-body="type: dynamic"
ammo-shape="type: sphere"
>
</a-sphere>
<a-plane
width="100"
height="100"
color="green"
rotation="-90 0 0"
ammo-body="type: static"
ammo-shape="type: box"
>
</a-plane>
ammo-body
のTypeには3種類
- dynamic(物理で動く)
- static(動かないもの。dynamicのオブジェクトに影響を与える)
- kinematic(物理では動かないがdynamicのオブジェクトに影響を与える)
があり、適切なものを設定します。なおデフォルトではdynamic
が設定されています。
また、ammo-body
では重さや摩擦など他の物理的なパラメータを設定することができます
ammo-shape
では主にコライダーについての設定を行います
typeではコライダーの形を設定しますBox,Shereなどがあります
これで実行すると球が平面に当たって止まる物理が実装されていることが確認できます
力を加える
物体に力を加えるには関数を使う必要があります
まず、専用のコンポーネントを作成します
今回はaddforce
という名前にしています
物体が生成されてから2000msec後に力を加えています
AFRAME.registerComponent('addforce', {
init() {
setTimeout(() => {
const force = new Ammo.btVector3(-10,0,-10)
this.el.body.applyCentralImpulse(force)
}, 2000)
},
})
8th Wallの場合、Ammo.btVector3
に警告が出ますが無視しても動作します。
次に、先ほどのSphereにaddforce
を追加します
<a-sphere
addforce
position="0 3 0"
color="red"
ammo-body="type: dynamic"
ammo-shape="type: sphere"
>
</a-sphere>
applyCentralImpulse
以外にもapplyCentralForce
力を加える位置を指定するapplyForce
などがあります
Discussion