ちょうど同じ期間でPaperVisionのWEB3D案件とFlashPlayer10を使ってのWEB3D案件を二つこなしたので、それを通じて僕が感じたそれぞれの一長一短を覚え書きしておきます。
PaperVision
3D空間内にとにかくモノを配置してしまえば、あとはXYZ軸などの空間移動はライブラリに任せておけば勝手にレンダリングしてくれます。
ただしMovieClipAssetMaterialなどマテリアルそのものがアニメーションしている場合、常にレンダリングを行う必要があるので注意が必要です。
具体的にはレックリ大陸のように地図上に大量の旗が立ち並ぶが旗そのものはアニメーションさせなくて良い場合に効果を発揮しました。
private function init3D():void
{
_scene = new Scene3D();
_viewport = new Viewport3D(0, 0, true, true);
_render = new BasicRenderEngine();
_camera = new Camera3D();
addChild(_viewport);
}
private function startRender():void
{
addEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
private function stopRender():void
{
removeEventListener(Event.ENTER_FRAME, onEnterFrameHandler);
}
private function onEnterFrameHandler(e:Event):void
{
_render.renderScene(_scene, _camera, _viewport);
}
こんな感じの関数を作っておいて、何かが動く場合、もしくはアニメーションする場合startRender()しておいて、止まったらstopRender()させるというプロセスを踏みました。
FlashPlayer10の場合
新しくなったFlashCS4の3D機能は、本格的な3D表現をしたい人には物足りないですが、今までFlash2Dアニメーションを制作していた人にとってはすんなり受け入れられるものになっていると思います。
そのぶん、レイヤー機能などが邪魔をして本格的に3D表現を行いたい場合、自前でzsortなどを行わないといけないですが、逆に言うとzsortを行わない限りはMovieClipのアニメーションなど、そのまま従来のFlashからすんなり受け入れられると思います。
おなかハリハリのように常にアニメーションしている場合、PaperVisionでは苦しかったのでFlashPlayer10の3D機能を使って制作しました。
表示するDisplayObjectの参照を_mc_all配列にぶちこんでおいて
private function startRender():void {
removeEventListener(Event.ENTER_FRAME, onContainerEnterFrameHandler);
addEventListener(Event.ENTER_FRAME, onContainerEnterFrameHandler);
}
private function endRender():void {
removeEventListener(Event.ENTER_FRAME, onContainerEnterFrameHandler);
}
private function onContainerEnterFrameHandler(e:Event):void
{
zSort();
}
private function zSort():void {
var _mc_all_length:int = _mc_all.length();
_mc_all.sortOn("y", Array.NUMERIC);
for (var i:int = 0; i < _mc_all_length; i++) {
setChildIndex(_mc_all[i], i);
}
}
こんなふうにしておけば、フレームをまたいでz軸が変化する場合はstartRender()を、一瞬だけz軸の整合性を保ちたい場合はzsort()すればいいので、かなり楽になりました。
PaperVisionとFlashPlayer10、どちらもとても楽しい道具となりそうです。
ちょうどGoogleも3Dプラグインを公開したことですし、WEB3Dの未来はますます面白くなりそうです。