note.x

[Papervision3D2.0] ピクセル等倍表示にトライ

「FlashやWebにまつわるいろいろなこと」さんで、

カメラの設定値からオブジェクトが100%で見える位置の算出ってどうやればいいんだろうか

Papervision3D 2D上で100%に見える位置は

っていうエントリを拝見。
そういややったことねーなと思って、既出かもしれないけどやってみた。

上記エントリによると、camera.focus:100、camera.zoom:11のとき、「ピクセル等倍で表示したい面」と camara の距離が1000離れていればいいと。これを汎用化するために、任意のfocus、zoomの場合にピクセル等倍になる距離を求められればいいのか。

大概こういう処理をする場合複雑に考えすぎて失敗するので、算数的な発想(むしろ勘)で

ピクセル等倍になる距離 = camera.focus * camera.zoom - camera.focus

という式をあてはめたら、なんか上手くいった模様(笑)

ただこれだと、camera.zoomが「1」のとき、ピクセル等倍になる距離が「0」になっちゃうので、camera.zoomを1にしないことが前提。また、ビューポートのアスペクト比で若干誤差が出るみたいなので、ブラウザのウインドウサイズによって1ピクセルくらいズレることがある。それと、FrustumCamera3Dはプロジェクション変換の方法が違うのでCamera3D、FreeCamera3Dを使ってることも前提条件になる。

そんなこんなで試しに作ったデモが以下。

e_tarot.jpg

tarot.swf(要:FlashPlayer9)
※カードをクリックすると、ピクセル等倍表示します。

カメラ位置の算出は下記のようなことをやってる。

var targetobj:DisplayObject3D = new DisplayObject3D();
targetobj.copyTransform( targetPlane );
targetobj.moveBackward( camera.focus * camera.zoom - camera.focus );

って感じで、targetobjっていうダミーのDO3Dを用意しておき、クリックしたPlane(targetPlane)の同次座標をコピーして、ピクセル等倍になる距離分、moveBackwardメソッドで平行移動させた位置がカメラを置くべき場所。(対象になるオブジェクトがPlane以外の場合、さらに位置をオフセットしないとダメ。)ここまでできれば、

targetobj.x
targetobj.y
targetobj.z

で、要素別に座標が取れるのでTweener使うなりなんなり。

ほんとにこれでいいのかは全く自信がないので、もっときちんとした方法があったら知りたいところ。

08/09/01追記:
Rev.639以降、FrustumCamera3Dとして定義されてたものがCamera3Dに変更、これまでのCamera3D、TargetCamera3Dは一部その性質が受け継がれたもののクラス自体は削除されちゃった。結果、上記の方法はRev.638以前のものに限定されます。
Rev.639以降で同様のことをするには、

ピクセル等倍になる距離 = camera.focus * camera.zoom - camera.focus + camera.focus

にするとよさげ。なんでこれで上手くいくのかはわからんのですが(えー)泥臭く試した結果、上手く行ってるようなので、とりあえずお茶を濁しておこうかと。

08/11/22追記
上の式、激しく余計な意味不明演算してた。

ピクセル等倍になる距離 = camera.focus * camera.zoom

これだけでオッケーです。超ハズカスィー。


Trackback URL : http://blog.r3c7.net/as3-software-rendering/166/trackback/

COMMENTS

  1. ekndesign - 2008.03.27 21:06:16

    rectさん、こんにちは
    FlashやWebにまつわるいろいろなことのものです
    これでハテナが解決できましたー!ありがとうございます。

    いつもブログ拝見させていただいておりました。
    興味深いエントリいつも参考にさせていただき
    とてもお世話になっておりましたー!

  2. rect - 2008.03.27 23:26:53

    >ekndesignさん

    どうもー。
    こちらこそ勉強になりましたよー。

Leave a Reply