ふんふん

2009年11月23日
最近ちょっと更新が滞ってます。
バンドの手伝いとか、手伝いじゃないのとか、色々もさもさしてて。

久しぶりに記事みなおしてみると色々直したいとこがあるなあ。。
とりあえず気になったのは、レンズフレアの記事で
もしかして黒に塗ってる意味ない?とか、
記事ではチャンネルコピーしてるけど
画像そのままコピーしてぼかしてアルファ値調べればいいだけ?とか・・・
負荷はあまり変わらないのかもしれないけどね。
落ち着いたら修正するかもしれません。
ステージ内でマウスを押した(MOUSE_DOWN)ままFlashの領域外までドラッグした時、
そのままではマウスを離したイベント(MOUSE_UP)を検出できないんだけど
マウスがFlash領域から出た時を検出できるEvent.MOUSE_LEAVEを使うと
マウスダウン→領域外までドラッグ→マウスアップのタイミングでもイベントが取れるので
これを利用してボタンの表示を元に戻したりドラッグ処理を停止したりできます。
ただswfをhtmlに埋め込む時にwmodeを指定していると
環境によってはMOUSE_LEAVEイベントが発生しない事があるっぽい。。。

ので、検証用にサンプルを用意してちょっと実験してみました。
全部WindowsXP、FlashPlayer10でテストしてます。ブラウザは4つだけ。

真ん中の黒いボックスがボタンになってて、
マウスを押すとオレンジに、離すと青に変化するようになってます。
「ボタン上でマウスダウン→Flash領域外までドラッグ→マウスを離す」ってやって
オレンジ→青と変われば成功ね。

wmode指定なし


IE8・Firefox3.0・Opera10・Safari4で全部問題なし。

wmode=transparent


Firefox3.0・Opera10・Safari4では領域外ドラッグでMOUSE_LEAVEが効かない。
挙動も色々おかしい気がする。
IE8では領域外(ブラウザ内)でマウスを離すと何故かstageのMOUSE_UPが発生して
その後領域外でマウスを動かすとMOUSE_LEAVEが発生した。
IE8でドラッグしてブラウザの外で離すとすぐにMOUSE_LEAVEが発生。

wmode=opaque


transparentと同じ結果。


結局

MOUSE_LEAVEを判定したい時はwmodeは指定すると駄目って事なのかな。
見にくいけどサンプルのソースはこれです
renderer.clipping = new FrustumClipping(~);
とかやっていると、
カメラを高速で回転した時とかに画面の端でポリゴンが
一瞬カリングされてしまう謎の現象があったんだけど
jp.ferv.blogさんの記事でやっと対処法がわかりました。

FrustumClippingを使うときはCamera3D.targetは使わず
代わりにCamera.lockAt()を使えば解決するようです。

で、これでめでたしめでたしと思いきや何故か上手くいかなくて、
結構長い間フガフガしてたんだけど
BasicViewクラスを使う時に
new BasicView(640, 480, false, false);
って第五引数を省略してたせいで
カメラタイプがデフォルトの"Target"になってしまってて
コンストラクタでcamera.target = DisplayObject3D.ZERO;されてたのが原因だった。。
いつも省略してたから全然気付かなかったよ・・・

new BasicView(640, 480, false, false, CameraType.FREE);
こんな風に第五引数を"Free"にして解決。

PV3D2.1: レンズフレア

2009年10月27日
Papervision3Dでウォークスルーの実験中。
walkthrough5.jpg
レンズフレアエフェクトをつけてみました。
海面のウネウネはなんか失敗。キラキラさせたかったんだけど・・・

太陽の部分は3dsMaxのレンズエフェクトでレンダリングしたもので、
画面全体にかかる光の輪はFlashの放射グラデーションです。
レンズフレアの仕組みはよくわかってないんだけど、
光の輪が複数個あって、それが画面中央の座標と光源を結ぶ直線上に並んでるって
イメージはあったのでそんな感じで表現してます。

PV3D2.1: 背景と高さ判定

2009年10月17日
Papervision3Dでウォークスルーの実験中。
walkthrough4.jpg
背景をつけてみました。
大きい一枚の画像をカメラの角度に合わせて上下左右にスクロールさせてます。
あと、高さ判定処理を組みなおして少しそれっぽく動けるようにしました。
高い所のモデルの下をくぐったり、高い所から落ちたりできます。

背景の追加

walk4sky.jpg
背景に使った空画像の全体図はこんな感じ。
手前のくっきりしてる雲だけTerragen2でレンダリング・・・というか知らない間に2出てたんだね。
カメラは横に0~360°しか動かないのでその角度と画像のX座標をリンクさせているだけです。
実際は端が切れないように画像を横方向に多めにループさせてます。
横方向は簡単だったんですが、縦方向がカメラから水平線の位置を割り出す必要があって、
今はまだ目分量による簡単な位置合わせしかしていないので正確ではないです。

ちゃんとした水平線の高さの割り出し方を調べるのがベストだと思うんだけど、
物凄い遠くに配置したダミーのDisplayObject3Dが常にカメラの正面(高さは海面)にくるようにして
そのダミーオブジェクトの座標を調べるって方法でもいける気がします。試してないけど・・・
Papervision3DではDisplayObject3D.autoCalcScreenCoords = trueしてから
DisplayObject3D.screenを調べれば基点のスクリーン座標が簡単に調べられるようです。

高さの判定

今までは単純にキャラ上空から真下に飛ばしたレイと地形モデルの最初の交点にキャラを移動させていただけで
モデルの下をくぐったりできなかったんですが、
今回は交差する全ての点の中から次に進める高さを調べているのでそれっぽく動けるようになりました。
(斜面を滑り落ちるような処理は高さ判定の処理とは別物です)
やっている事はだいたいこんな感じです。
heightcheck.png
基本的にキャラクターの移動前の高さと移動後の高さを比べて
先に進めるか進めないかの判定くらいしかしていません。
先に進めなかったら移動前の位置に戻しています。
高さ判定のコードがそれ以外の処理に混ざってしまっているのでコードは割愛しますが
内容はほとんど上の図そのままです。if文だらけになるのはしょうがないのかな。。
こんなに条件が多くなってしまったのは高いところから落下する処理があった為で、
常に足が地面に接地しているだけなら
  • 一番近い高さに移動させる
  • 高さが違いすぎたら元に戻す
この処理だけでもなんとかなりそうな気がします。

条件分岐が多いとはいえ交差判定は今まで通り1回だけで済んでいるので
処理はたいして重くならずに済みました。
ただ高さだけで判定していて正面に壁があるかどうかはまったく調べていないので、
ゲームでよくある壁に沿って滑るような動きができないし、
キャラクタ―が壁に半分めり込んだりします。
複雑な地形での壁の判定はどうしようかな・・・
過去の記事を見直してたら追記したはずのテキストがいつのまにかごっそり抜けてた。
キャッシュから修正しておいたけど、なんだったんだろう。。
再構築した時になんかおかしくなっちゃったのかな・・・

あと最近Alternativa3Dを勉強しようか迷ってます。
作りこんでくるとどうしてもPapervision3Dは表現的な制約が多くて。。
かといってAlternativa3Dは国内の記事が少なくて行き詰った時に大変そうだし、
頑張って使えるようになった後にPapervision3Dがバージョンアップしたら虚しいし。
とりあえずクリッピングといい感じのポリゴンソート(っていうの?)とテクスチャの歪み補正が
常に使える状態になってくれれば幸せになれそうなんだけどなあ。ふがふが。

PV3D2.1: 水の流れの表現

2009年10月 7日
前回のエントリーの続きです。
滝と川を作ったんですがそのアニメーションのさせ方なんかをメモしておきます。

walk3takitsubo.jpg
Papervision3Dでウォークスルーの実験中。
今回は島を作ってテクスチャ貼ってみたよ。
足元の高さ判定の処理はまだちゃんと組んでないので
穴が開いた地形の下もくぐれないし、高い所から落ちると一瞬で着地します。

walkthrough3.jpg
矢印キー:移動
SHIFT+矢印キー:カメラ回転
F:FPSの限界切り替え
W:ワイヤーフレームON/OFF
M:テクスチャの歪み補正ON/OFF
1~4:レンダラ切り替え(デフォルトは1)

PAGE UP:カメラズームイン
PAGE DOWN:カメラズームアウト
HOME:カメラズームリセット

視線とメッシュの交差判定を高速化してみました。
サンプルのポリゴン数は前回と同じにしてあります。
walkthrough2.jpg
矢印キー:移動
SHIFT+矢印キー:カメラ回転
右上MAPクリック:地形変形
FPSクリック:FPSの限界切り替え
以前のエントリの視線とメッシュの交差判定を使って
凸凹の地形を歩かせてみました。

walkthrough1.jpg
  • 矢印キーで移動
  • 右上のマップをクリックすると地形変形