- 2008年1月21日 04:34
- flash
昨年の秋から放置していた Papervision3D をそろそろ触ってみることにした。あまり基本的なことをやっても楽しくないので、rch850 さんの Metasequoia クラスを使って .mqo ファイルを読み込んでみることにした(3Dデータは三次元CG@七葉の保管庫から△2000の初音ミクをお借りしました)。まず、PV3D1.5 でやってみたのがコレ。
- PV3D1.5で初音ミク ※かなり重いです。
Metasequoia クラスを GreatWhite に対応させる
表示はできるけど、やっぱり「最新のリビジョンでやってみたい」ということで、Metasequoia クラス(PV3D1.7版)を PV3D 2.0 GreateWhite(リビジョン395)に対応させてみた。
まずは import パスの置き換え。
note.x さんのこの記事によると、PV3D1.7 の Face3D クラスが Triangle3D に、Mesh3d クラスが TriangleMesh3D に名前が変更され、仕様が変更されたとのこと。更に PV3D1.7 から PV3D2.0 になってディレクトリ構成が大幅に変更されていたので、クラス名で検索をかけつつパスを置き換えてみた。
33~37行目。
import org.papervision3d.core.geom.Face3D;
import org.papervision3d.core.geom.Mesh3D;
import org.papervision3d.core.geom.Vertex3D;
import org.papervision3d.core.Matrix3D;
import org.papervision3d.core.NumberUV;
↓
import org.papervision3d.core.geom.TriangleMesh3D;
import org.papervision3d.core.geom.renderables.Triangle3D;
import org.papervision3d.core.geom.renderables.Vertex3D;
import org.papervision3d.core.math.Matrix3D;
import org.papervision3d.core.math.NumberUV;
43行目。
import org.papervision3d.materials.MaterialsList;
↓
import org.papervision3d.materials.utils.MaterialsList;
53行目。Metasequoia クラスは Mesh3D クラスを継承しているので、TriangleMesh3Dクラスに変更してやる。
public class Metasequoia extends Mesh3D {
↓
public class Metasequoia extends TriangleMesh3D {
331行目。Face3D を Triangle3D に。
var face:Face3D;
↓
var face:Triangle3D;
最後に、346, 348, 362, 386, 388, 401, 403 行目の Face3D インスタンスが生成されている所を、 Triangle3D に変更。ただ、PV3D 2.0 では面が属する DisplayObject3D を第1引数に取るようになったようなので、以下の例と同様に 7 行分置き換えてやる。なぜ this を渡しているかというと、面が属すのは DisplayObject3D を継承している TriangleMesh3D、つまり Metasequoia 自体を渡せばいいのでは?という結論に至ったから。まぁ、動いたのでOK。
note.x | [Papervision3D2.0] TriangleMesh3D
- do3dInstance:面が属するDisplayObject3D?(若干自信無い)
- vertices:面を構成する頂点Array
- material:面のマテリアル?(未調査)
- uv:面のUV座標Array
例)346行目
face = new Face3D([a, b, c], material, [uvA, uvB, uvC]);
↓
face = new Triangle3D(this, [a, b, c], material, [uvA, uvB, uvC]);
PV3D 2.0 GreatWhite で初音ミク
PV3D 2.0 GreatWhite に対応させた Metasequoia クラスを使って初音ミクを読み込んだ結果がコレ。若干軽くなった。
- PV3D2.0 GreatWhite で初音ミク※かなり重いです。
これで PV3D 1.5/1.7 を使わなくても .mqo 形式で読み込めるようになりました。
以下ソースコード。
package {
import flash.display.*;
import flash.events.Event;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;
import org.libspark.pv3d.Metasequoia;
[SWF(width="800", height="800", backgroundColor="#000000")]
public class HatuneMiku extends Sprite
{
private var scene:Scene3D;
private var camera:Camera3D;
private var viewport:Viewport3D;
private var renderer:BasicRenderEngine;
private var rootNode:DisplayObject3D;
private var valx:Number = 0;
public function HatuneMiku()
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
stage.quality = StageQuality.MEDIUM;
stage.addEventListener(Event.RESIZE, onStageResize);
initialize();
}
protected function initialize():void
{
viewport = new Viewport3D(stage.stageWidth / 2, stage.stageHeight / 2,false, false, true, true);
viewport.x = stage.stageWidth / 4;
viewport.y = stage.stageHeight / 4;
this.addChild(viewport);
renderer = new BasicRenderEngine();
camera = new Camera3D();
camera.focus = 500;
camera.zoom = 1;
camera.z = 500;
scene = new Scene3D();
rootNode = scene.addChild(new DisplayObject3D("rootNode"));
//.mqoファイルの読み込み
var mqo:String = "http://nondelion.com/samples/as3/HatuneMiku/mqo/output_0.mqo";
var obj:Metasequoia = new Metasequoia();
obj.load(mqo, 0.7);
obj.pitch(0);
rootNode.addChild(obj);
this.addEventListener(Event.ENTER_FRAME, loop3D);
}
private function loop3D( event:Event ):void
{
valx += (viewport.mouseX - viewport.width / 2) / 50;
rootNode.rotationY = valx;
renderer.renderScene(scene, camera, viewport);
}
private function onStageResize(event:Event):void
{
viewport.x = stage.stageWidth / 2 - viewport.width / 2;
viewport.y = stage.stageHeight / 2 - viewport.height / 2;
}
}
}
※2008-02-03T12:44:00+09:00 追記
本家 libspark の Metasequoia クラスが正式に GreatWhite に対応したようです。
- Newer: 建築と芸術と動物たち
- Older: 続・swfobject で flash を Window 内に全画面表示