飴屋

Flash3D/物理演算アニメーション

物理演算

Papervision3Dによる3DCG表現を早足で眺めてきましたが、空間上の物体は通常、配置された場所に固定されているだけです。これにマウスやキー入力に応じて、カメラの座標や特定の物体を移動させることでインタラクションが生まれます。また、イベントやタイマーを使って物体を移動させることで能動的な表現も可能になります。

それらの応用として、この3D空間上に実世界のような物理を適用させることもできます。物体は重力に従って放物線を描いて落下し、質量を持つ物体同士がぶつかれば、運動の方向や力が変更されます。(物体が壊れて音が出たらもっと面白いけど)こういった物理法則を記述することで、意図的なアニメーション処理の記述を減らすことができるので、開発者は他の部分に注力をすることもできますし、なにより物理法則は現実世界で実際に起こっている事象ですので、ユーザとの親和性が非常に高い点が魅力的です。実際にモバイルアプリで大ヒットしたAngryBirdなんかは2Dではありますが、物理演算がとても直感的に働いてエンターテイメント性を高めていると思います。ただし、これらの演算処理は計算コストがそれなりに高いので、厳密な計算を行うととても大変なことになります。

jiglibflash

私はPapervision3Dという3Dエンジンとともにjiglibflashという物理演算ライブラリを使ってゲームを作っていました。jiglibflashは開発が停滞していると勝手に思い込んでいたのですが、昨年、ガンガン更新されていることに気がつきました。orz

このライブラリはPapervision3D以外にもAway3D、Sandy3D、Five3Dなどいろいろな3Dエンジン用のインターフェイスを持っているらしいので、いろんなプロジェクトに応用が効きそうです。ただ、3Dエンジンと物理演算エンジンは結構やることがリンクする部分があるので、二つに分かれていることのコストっていうのがあるんじゃないかなって思ってます。(そのコストは見積もってないですが。)MatrixとかNumber3Dとか似たようなクラスが同時に存在するのが嫌なだけかもしれません。これを統合しようという流れがAltnativa3Dにあるとかないとか聞いたのですが、このライブラリはソースが非公開だとかで中身がどんな風になっているのかわかりません。

jiglibflashの俯瞰

以下に、jiglibflashのファイル構成を書いておきます。

plugin/
AbstractPhysics.as
ISkin3D.as
ITerrain.as
papervision3d/
Papervision3DPhysics.as
Pv3dMesh.as
pv3dTerrain.as
away3dlite/
Away3DLiteMesh.as
Away3DLitePhysics.as
Away3DLiteTerrain.as
HeightMapData.as
away3d/
Away3dMesh.as
Away3DPhysics.as
Away3DTerrain.as
sandy3d/
Sandy3DMesh.as
Sandy3DPhysics.as
five3d/
FIVe3DMesh.as
FIVe3DPhysics.as
collision/
CollDetectBoxBox.as
CollDetectBoxPlane.as
CollDetectBoxTerrain.as
CollDetectCapsuleBox.as
CollDetectCapsuleCapsule.as
CollDetectCapsulePlane.as
CollDetectCapsuleTerrain.as
CollDetectFunctor.as
CollDetectInfo.as
CollDetectSphereBox.as
CollDetectSphereCapsule.as
CollDetectSpherePlane.as
CollDetectSphereSphere.as
CollDetectSphereTerrain.as
CollisionInfo.as
CollisionSystem.as
CollPointInfo.as
cof/
JConfig.as
vehicles/
JCar.as
JChassis.as
JWheel.as
math/
JMath3D.as
JMatrix3D.as
JNumber3D.as
data/
CollOutBodyData.as
CollOutData.as
ContactData.as
EdgeData.as
PlaneData.as
SpanData.as
TerrainData.as
physics/
BodyPair.as
CachedImpulse.as
HingeJoint.as
MaterialProperties.as
PhysicsController.as
PhysicsState.as
PhysicsSystem.as
RigidBody.as
constraint/
JConstraint.as
JConstraintMaxDistance.as
JConstraintPoint.as
JConstraintWorldPoint.as
geometry/
JAABox.as
JBox.as
JCapsule.as
JPlane.as
JRay.as
JSegment.as
JSphere.as
JTerrain.as

Flash3D