プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
HeightmapCollision起動直後
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に気軽に変換できないものでしょうか?

というわけで、しばらく試したのですが…ダメでした。出来ればホームページのネタにしたかったんですけど、諦めます。
何か方法はあると思います(自力でミップマップをセットするとか)が、素直にコンテントパイプラインを利用した方が早そうです。



◎次回予告

やっとサンプルの解析が終わったので、メインプログラムに組み込みます。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。