NoImage

この記事は半年以上前の情報なので、古い可能性があります

Papervision3Dやってみる(2) 【ぐるぐる回る】

2008年01月26日  投稿者:ハセガワ
Flashで驚異の3Dムービーを作れるPapervision3Dで球をぐるぐる回す
ブックマークする:

FlashPlayerをインストールするか、JavaScriptをONにしてください。
■筆者の理解状況

・ドラクエで言うと何とかスライムベスが倒せるようになった程度。
・Papervision3Dのバージョンは2.0(GreatWhite)

▼1.ぐるぐる回るボール

前回は全くできませんでしたが、ぐるぐる回せました。
以下、追加ソース。

//クラス部分
public class Test extends BasicView {
  
 private var mySphere : Sphere; //…1   
  public function Test() {
    super (0,0,true,false,"CAMERA3D");//…2
    
     camera.z = -300;
//…3
     camera.focus = 100;
     camera.zoom = 1;
     
     mySphere =new Sphere(null,200,12,12);
//…4
    scene.addChild(mySphere); 
  startRendering();
  }
 
 override protected function onRenderTick(event:Event=null):void {//…5
    mySphere.rotationX += 0.5;
    mySphere.rotationY += 0.2;
    mySphere.rotationZ += 0.1;
    super.onRenderTick(event);
   }
 }
今回わけがわからなかった単語
  • super
  • override

まず、【1】の

private var mySphere : Sphere; 

ですが、このクラス内でだけ使えるプライベートな変数ってことですよね?
コンストラクタで「球を作って回転させる」を書く前の、準備あるいは初期設定みたいなものでしょう。
「このクラスにmySphereってのが出てきたら、それはSphere(球)です」と決めているわけです。
Sphereってのは、前回

import org.papervision3d.objects.primitives.*;


で読み込んだPV3Dのクラスに定義されてるに違いありません。 
前回は球を表示するだけだったので省略してましたが、「回転する」という動作に必要になってきますから、コンストラクタの前に書きました。

super()って? 

FlashCS3のリファレンスによると、

コンストラクタは、super() ステートメントを使用して直接のスーパークラスのコンストラクタを明示的に呼び出すことができます。

とありました。スーパークラス?何ですかそれ。

と思ったのですが、今作ってるTestというクラスは、PV3DのBasicViewというクラスを継承して作られた、いわば子供のクラスですから、スーパークラスってのは親元、BasicViewのコンストラクタを指すのでは?と思いました。
と思って【paprevision3d>>view>>BasicView.as】を開いてみたところ、

public function BasicView(viewportWidth:Number=640, viewportHeight:Number = 320, scaleToStage:Boolean=true, interactive:Boolean = false, cameraType:String = "CAMERA3D")

がありました!
super (0,0,true,false,"CAMERA3D");
は、このコンストラクタの値(=引数)(viewportWidth,viewportHeight,scaleToStage,Interactive,cameraType)を引き継いでいる、と考えてよいわけですよね?きっと。

でもよく考えたら、「0,0,」はともかく、「true,false,"CAMERA3D"」は初期値のままなので、省略できるんじゃないですか?
というわけで、

super(0,0);

でも動くんじゃないかな?と思ったら、動きました!ひょっとして「0,0,」も省略できるの?

super();

ああっ、動いた!
あれ....?この行自体を削除しても動いてますね。。この行いらないんだ。
その下のcameraの記述に必要なんだとばかり思ってましたが。。もっと勉強します。

override

5のoverrideですが、FlashCS3のリファレンスには

メソッドで継承したメソッドを置き換えるよう指定します。継承したメソッドをオーバーライドするには、override 属性を使用する必要があります。

とありました。ふむふむ、要は親クラスの関数を継承して、実行部分を上書きする、って感じですかね。
じゃあBasicViewから継承してきた【protected function onRenderTick】という関数を上書きしてるのかな、、BasicView.asを探したけどない。ということは、BasicViewの更に親クラス、AbstractViewクラスにあるのかな……。

あ、ありました。【papervision3D>>view>>AbstractView.as】の中に。

//AbstractView.as

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

なるほど、scene,_camera,viewportをレンダリングする、という命令ですね。で、その上の方に、

//AbstractView.as

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

がありました。startRendering()は、ENTER_FRAMEイベントを実行していたんですね。
イベントを記述しなくても回転し続けたわけがわかりました。
つまり、

  • startRendering():毎フレーム【onRenderTick】やるよ~
  • onRenderTick():画面に実際にscene,_camera,viewportをレンダリングするよ~
  • override ~onRenderTick():↑に加えて、球のx,y,z回転も足してね(自分で書き足した)。

ということになりますね(プログラマの方から見ればアバウトすぎる理解方法だと思いますけれど)。

よし、調子が出てきたので、次はSphere以外のプリミティブオブジェクト(最初から用意されている形)をいくつか書いて何かしてみます。

僕が買った、もしくは買う予定の参考書
参考書は指定されていません
ブックマークする
FlaTech+を購読する
  • 全記事を含むRSSfeed
  • このページをブックマーク: