[Papervision3D2.0] ピクセル等倍表示にトライ
カメラの設定値からオブジェクトが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を使ってることも前提条件になる。
そんなこんなで試しに作ったデモが以下。
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/wp-trackback.php?p=166

rectさん、こんにちは
FlashやWebにまつわるいろいろなことのものです
これでハテナが解決できましたー!ありがとうございます。
いつもブログ拝見させていただいておりました。
興味深いエントリいつも参考にさせていただき
とてもお世話になっておりましたー!
>ekndesignさん
どうもー。
こちらこそ勉強になりましたよー。