HeightmapCollision筆者がサンプルを起動した直後の画面。謎の黒い線が表示されている。
サンプルHeightmapCollisionの解析が終わったので、今回は解析結果を中心に記述します。
◎サンプル解析(概要)1.TerrainProcessor.cs内で、グレースケールマップの
色情報を取得し高さを決定、地形メッシュを構築する。
2.HeightMapInfoContent.cs内でも同様に
高さ情報を取得し、2次元配列に格納する。
3.HeightmapCollision.cs内で、プレイヤーの入力に
基づいてボールとカメラを移動する。
◎サンプル解析(詳細)TerrainProcessor.cs:
1.グレースケールマップをピクセル単位に変換する
2.ピクセル単位で色(高さ)情報を取得し、新規メッシュに
頂点を追加する(前半のforループ)
3.新規メッシュのマテリアルを設定する
4.新規メッシュに頂点を追加する(後半のforループ)
5.作成した新規メッシュを返却値として設定する
HeightMapInfoContent.cs:
1.ピクセル単位で色(高さ)情報を取得し、
2次元配列に格納する(コンストラクタ)
2.作成した2次元配列を
メインプログラムに渡す([ContentTypeWriter])
HeightMapInfo.cs:
1.2次元配列の値を利用して、
指定された座標の高さを返す(GetHeight)
HeightmapCollision.cs:
1.キーやパッドの入力からボールの新座標と高さを
算出する(HandleInput)
2.ボールに連動してカメラを移動する(UpdateCamera)
3.地形とボールを表示する(DrawModel)
◎黒い線の正体は?私がHeightmapCollisionを起動すると、黒い線が表示されていました(冒頭参照)。私はこの線に沿ってボールを動かすゲームかと思っていたのですが、プログラムを解析しても、そのようなコードは見当たりません。
ひょとして、黒い線が表示されるのは私だけ…?(^^;
もしそうだとしたら、画像を257*257から256*256に修正したことが原因でしょう。試しに、128*128に修正したら…黒い線が綺麗さっぱり消えました。
黒い線は偶然の産物だったんですね。
分岐した線がゲームっぽいから気付きませんでした(笑)
◎線形補完する理由は?HeightMapInfo.csのGetHeight()は、2次元配列の値を単純に返すのではなく、隣接座標との間の高さも取得し線形補完した値を返しています。(MathHelper.Lerp)
これは何故?
試しに、線形補完をやめて配列の値を直接返すよう改造すると、ボールを動かす際に、カメラ移動が鋭角になりました。自転車で砂利身を走った時にガタガタ揺れるような感覚で、全然気持ちよくないです。
どうやら、移動元と移動先に高低差がある場合でも、滑らかになるよう補完していたようですね。ボールはマップ座標系よりも細かい単位で動くので、マップ座標の隙間を補完することによって、より精密な高さを算出しているのでしょう。
◎XNAの画像フォーマットについてXNAで2D座標上の色を取得するメソッドは、今の所GetPixelしか見付かっていません。しかもPixelBitmapContentクラスにのみ提供されており、使用頻度の高いTexture2Dクラスなどでは提供されていません。
これは多分、Texture2D内のイメージデータのフォーマットがピクセル単位ではないため、一度PixelBitmapContentクラスに変換しないと、ピクセル単位の色を取得することができないのでしょう。
今回のサンプルでは、コンテンツから読み込むイメージデータをTexture2DContentクラスに格納し、Texture2DContent.Mipmaps[0]で取り出しています。
これはこれで良いのですが、Texture2DからPixelBitmapContentに気軽に変換できないものでしょうか?
というわけで、しばらく試したのですが…ダメでした。出来ればホームページのネタにしたかったんですけど、諦めます。
何か方法はあると思います(自力でミップマップをセットするとか)が、素直にコンテントパイプラインを利用した方が早そうです。
◎次回予告やっとサンプルの解析が終わったので、メインプログラムに組み込みます。
テーマ : ゲーム製作 関連 - ジャンル : ゲーム
コメントの投稿