そのままタイトルにしてしまったw
Papervision3D 2.0で追加されたBasicViewクラスはカメラやViewPortといった,描画でかならず必要となるクラスをまとめて宣言してくれるすぐれもの.
Spriteクラス→AbstractViewクラス→BasicViewクラス
という継承なのでSpriteとしても使えるところが便利.
で,BasicViewクラスでカメラを"CAMERA3D"で宣言して自由にカメラを動かそうと思ったときに気づいたことなんだけど・・・.
カメラを設定するために以下のようなコードを書いた.
basicView = new BasicView(container.stage.stageWidth,
container.stage.stageHeight,
true,
true,
"CAMERA3D");
// カメラの位置
basicView.camera.x = 0;
basicView.camera.y = 0;
basicView.camera.z = -1800;
// カメラの視点
basicView.camera.target.x = 100;
basicView.camera.target.y = 0;
basicView.camera.target.z = 0;
��本来はBasicViewをextendした方がスマートかもね)
上のコードを実行すると,
(;・∀・)あれ?
targetが未定義だと怒られた.
CAMERA3Dを指定したんだし,targetはCamera3Dクラスでpublicなんだから,当然Camera3Dクラスのプロパティは使えるはずだよね?
で,ソースを読んでみた.
どうやらスーパクラスのAbstractViewクラスでカメラのプロパティ_cameraを宣言して,getterを使ってcameraでプロパティアクセスができるようになっていたのだけど・・・
protected var _camera:CameraObject3D;
public function get camera():CameraObject3D
{
return _camera;
}
(;・∀・)ハッ?
_cameraプロパティがCameraObject3Dクラス!?
カメラにはCamera3Dクラス,FreeCamera3Dクラス,FrustumCamera3Dクラスの3つあって,CameraObject3Dを継承している.
で,BasicViewクラスではそれらをnewして_cameraに代入しているのだけれど・・・_cameraプロパティがCameraObject3Dクラスだったら,継承したプロパティ(target)なんかあるはずねぇよw
まだまともにPapervision3D始めて1日も経ってないのに,いきなりバグ発見?
ヾ(・∀・;)オイオイいくらベータとはいえこんな初歩っぽいところで間違っててこれでいーのか.
まあ,でもまだバグって決まった訳じゃないし・・・.
AbstractViewクラスの_cameraプロパティがCameraObject3Dクラスである理由が分かる方がいたら是非教えて頂けるとありがたいです.
とりあえず,対策としてAbstractViewクラスを次のように編集してどうにかしてみた.
protected var _camera;
public function get camera()
{
return _camera;
}
追記:
自己解決.
よく見たら,BasicViewクラスにこんな記述が.
public function get cameraAsCamera3D():Camera3D
{
return _camera as Camera3D;
}
コレ使ってアクセスしろというわけですか.
つまり,
basicView.cameraAsCamera3D.target.x = 100;
basicView.cameraAsCamera3D.target.y = 0;
basicView.cameraAsCamera3D.target.z = 0;
とすればよかったのね.
でも,そうすると_cameraのsetterが全く持って意味がないよね.
そういうところってちゃんと整理しておかないとダメだと思うんだけどなぁ.