2009年5月26日火曜日

[Pv3D]Papervision3Dやってみた その1[AS3.0]

今回は球を表示させるだけの簡単なプログラム。
カメラを動かさないとなんだがなんだが3Dな感じがしませんね。

実行結果
ソースコードはすごい短いです。

package {
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.view.BasicView;

[SWF(backgroundColor="#ffffff")]
public class lets3d extends BasicView {
public function lets3d() {
var ball:Sphere = new Sphere(null, 500, 50, 50);
scene.addChild(ball);
startRendering();
}
}
}

今回はこちらを参考にさせてもらいました。
ソースコードが短いのは6行目の"extends BasicView"をしてるおかげみたいです。Pv3Dの便利機能の1つと考えていいんでしょうか。

BasicViewを使わない方もいらっしゃいます。鮭さんとかそうですね。
勉強がてら自分も"extends BasicView"をしないで挑戦してみました。

というわけで、まず動作を理解するためにBasicView.asの中身を見てみます。

package org.papervision3d.view
{
import org.papervision3d.cameras.SpringCamera3D;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.cameras.CameraType;
import org.papervision3d.cameras.DebugCamera3D;
import org.papervision3d.core.view.IView;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
/* @author Ralph Hauwert
* 中略 */
public class BasicView extends AbstractView implements IView
{
/* 中略 */
public function BasicView(viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = "Target")
{
super();

scene = new Scene3D();
viewport = new Viewport3D(viewportWidth, viewportHeight, scaleToStage, interactive);
addChild(viewport);
renderer = new BasicRenderEngine();

switch(cameraType)
{
case CameraType.DEBUG:
_camera = new DebugCamera3D(viewport);
break;
case CameraType.TARGET:
_camera = new Camera3D(60);
_camera.target = DisplayObject3D.ZERO;
break;
case CameraType.SPRING:
_camera = new SpringCamera3D();
_camera.target = DisplayObject3D.ZERO;
break;
case CameraType.FREE:
default:
_camera = new Camera3D(60);
break;
}

cameraAsCamera3D.update(viewport.sizeRectangle);
}

/**
* Exposes the camera as a Camera3D
*/
public function get cameraAsCamera3D():Camera3D
{
return _camera as Camera3D;
}
/* 略 */
}
}

これも"extends AbstractView"となっているので、AbstractView.asの中身も覗いてみます。

package org.papervision3d.view
{
import flash.display.Sprite;
import flash.events.Event;

import org.papervision3d.core.proto.CameraObject3D;
import org.papervision3d.core.view.IView;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;

/**
* @Author Ralph Hauwert
*/
public class AbstractView extends Sprite implements IView
{
protected var _camera:CameraObject3D;
protected var _height:Number;
protected var _width:Number;

public var scene:Scene3D;
public var viewport:Viewport3D;
public var renderer:BasicRenderEngine;

public function AbstractView()
{
super();
}

public function startRendering():void
{
addEventListener(Event.ENTER_FRAME, onRenderTick);
viewport.containerSprite.cacheAsBitmap = false;
}

/* 中略 */
protected function onRenderTick(event:Event = null):void
{
renderer.renderScene(scene, _camera, viewport);
}

/* 略 */
}
}

今回使わなかった部分は略しました。
ところでこれって勝手に載せていいんですかね?問題はないと思うけど。

上2つを参考に最初のプログラムを書きなおします。

package {
import flash.display.Sprite;
import flash.events.Event;
import org.papervision3d.cameras.Camera3D;
import org.papervision3d.objects.DisplayObject3D;
import org.papervision3d.objects.primitives.Sphere;
import org.papervision3d.render.BasicRenderEngine;
import org.papervision3d.scenes.Scene3D;
import org.papervision3d.view.Viewport3D;

[SWF(backgroundColor="#ffffff")]
public class lets3d2 extends Sprite {
public var scene:Scene3D;
public var camera:Camera3D;
public var viewport:Viewport3D;
public var renderer:BasicRenderEngine;

public function lets3d2() {
scene = new Scene3D();
camera = new Camera3D(60);
viewport = new Viewport3D(0, 0, true, true);
renderer = new BasicRenderEngine();
addChild(viewport);

camera.target = DisplayObject3D.ZERO;
camera.update(viewport.sizeRectangle);

var ball:Sphere = new Sphere(null, 500, 50, 50);
scene.addChild(ball);

addEventListener(Event.ENTER_FRAME, renderTick);
viewport.containerSprite.cacheAsBitmap = false;
}

protected function renderTick(event:Event = null):void {
renderer.renderScene(scene, camera, viewport);
}
}
}

最初のに比べるとソースコードは長くなりました。
実行結果はこちら

見事同じものができました。

結論:
BasicViewがつかえるのなら、使ったほうがいいんでね?

0 件のコメント:

コメントを投稿