Papervision3Dの最近のブログ記事

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回だけで済んでいるので
処理はたいして重くならずに済みました。
ただ高さだけで判定していて正面に壁があるかどうかはまったく調べていないので、
ゲームでよくある壁に沿って滑るような動きができないし、
キャラクタ―が壁に半分めり込んだりします。
複雑な地形での壁の判定はどうしようかな・・・

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
  • 矢印キーで移動
  • 右上のマップをクリックすると地形変形
前回のエントリー
「DisplayObject3D.world」でモデルのワールド空間での
移動・回転・スケールの変換行列が取得できる

と書いたんですが、どうやらworldプロパティは
シーンがレンダリングされるタイミングで初めて値が更新されるみたいです。

てことは、モデルを回転してからworldプロパティにアクセスしても
レンダリング直前では回転を適用する前の情報しか取れない事になる・・・
逆にレンダリングしてからアクセスしてしまうと、
例えば常に回転しているモデル上をキャラが歩く場合、
モデル回転→レンダリング→ワールド座標を取得して交差判定→キャラを動かす
という処理の流れになってしまって
キャラクターの描画が遅れる事になってしまう。。
かといって正確なworldプロパティを取得する為だけに
2回レンダリングするのも無駄すぎる・・・

色々調べて、どーしてもいい方法が見つからなかったので
worldプロパティを使わずにワールド空間での変形情報(Matrix3D)を調べる事にしました。
Papervision3Dでウォークスルーをさせようと思ってます。
キャラクターが水平な地面を動くだけなら壁の判定だけすればいいんですが
凹凸のある地形に沿って動かしたいので
足元のポリゴンの高さを調べる必要があります。
checkheight.png

Shockwave3DにはmodelsUnderRayっていう
レーザーを飛ばしてポリゴンに当たった座標が調べられる機能があったんで
Papervision3Dにもあるかなーって調べたけど見つかりませんでした。。
見つけられなかっただけで本当はあるのかもしれないけど、
諦めてmodelsUnderRay的な機能を作る事にしました。
やってることは、対象のメッシュモデルの全三角ポリゴンに対して、
視線と三角形が交差しているかひたすらチェックしていって、
交差しているものがあったら交差情報を返すという感じです。

Papervision3D始めるよ

2009年9月 1日
ネット自体もう何年もやってなかったので
昔繋がりがあった人も、とっくにサイトがなくなったりしてて
軽く浦島状態です。みんな生きてるのかな・・・

もうお爺さんになってしまったんですが
今頃になってPapervision3Dを始めたので
わかった事とかメモしていこうかなと思います。
バージョンによってだいぶ作りが違うみたいなんですが、
自分はGoogleCodeのここにある2.1.920を使ってます。

とりあえず始めに、色んなものに流用できるような
3D空間内を自由に歩けるものを作りたいなあ。
昔やってたShockwave3Dの感覚で
表示は1万ポリゴンくらい余裕かなって思ったら余裕で無理でした。。
地形とか、かなり簡略化しないと。