開発中のメイン画面正確な高さが取得できるようになり、ユニットが空中に浮いたり地面に埋まらなくなった。部隊ユニットは個体毎に高さを取得し配置している。
◎高さ情報の出力高さのズレを解消するため、高さ情報をテキスト出力して違いを確認します。
まずは地形作成プログラムの高さ情報をファイルに出力します。最初はコンソールに値を出力してコピペしようとしましたが、しばらく待っても終わらなかったので、結局C#でFileSystemObjectに出力しました。
XNA地形の高さ情報(テキスト形式)(0.6M)次にメタセコイアの地形モデルから頂点情報を取得します。モデルの頂点情報を取得するのって結構ややこしいんですよね。
以前HPにまとめた記事を参考に頂点フォーマット(vertexElement)を確認したら、Position、Color、TextureCoordinate、Normalの4つでした。
そういえば、メタセコイアモデルの頂点フォーマットはXNAの標準構造体と合わないのでしたね。一応カスタム頂点フォーマットを作成して頂点座標を取得し、テキストファイルに落としました。
メタセコイア地形モデルの頂点座標情報(テキスト形式)(2M)◎頂点情報の格納順序ファイルは出力したものの、頂点情報はインデックス順で格納されているため、このままでは容易に比較できません(例えば、1番目の頂点情報が左上隅とは限りません)。
格納順序を解析して再展開するのも面倒なので、CSV形式で再出力しExcelでソートしました。
メタセコイア地形モデルの頂点座標情報(PDF形式)(7K)参考までに4列目に行番号(=インデックス格納番号)を付けてからソートしたら、左上隅は1776番目、右下隅は5007番目の頂点でした。そういうものなんだ…。
ちなみに、X座標とZ座標は100倍して考えると分かりやすいです。細かい誤差があるのは、縦横2.56の大きさのマップを255で分解したからです(分解数を256にするとインデックスがオーバーフローするため)。
◎計算式を求めるソートしたシートに先の高さ情報を転記し、高さ情報とY座標から適切な計算式を求めます。
頂点座標と高さ情報から計算式を求める(PDF形式)(11K)まず、ある特定の頂点(ここでは左上頂点としました)と各頂点とのY座標差分や高さ情報差分を求め、それらの比率を算出しておよその倍率を24と決めました。次に、Y座標−高さ情報/24を算出し、およその差分を80と決めました。
つまり、メタセコイア地形モデルを100倍スケールで表示し、ユニットを「高さ情報/24+80」に配置すればズレがほぼ解消できるはずです。
しかし実際にやってみると、全然合いません。調べてみると、グレースケールのTerrain Bumpiness や Terrain Scaleプロパティの値が、データ出力プログラムと実行プログラムで違ってました。先にこれらを適当な値に調整してから高さ情報を出力すべきだったかも。
とりあえずプロパティを出力プログラムと同じ値にセットしてやり直したら、今度は合いました。

厳密に言うと、まだ若干の誤差はありますが、これまでの中では一番誤差が少ないと思います。
100%一致しない理由は不明ですが、Excelシートで微妙な誤差があったことを考えると、メタセコイアの地形作成機能は山の頂点を滑らかにするなどの調整がされているのかもしれません。
◎テクスチャマッピングのずれ納得できる計算式が確立したので、地形モデル(分解数255)のテクスチャマッピングを行います。メタセコイアの範囲選択は座標指定できないので、縦横64マスを数えて範囲指定します。目が疲れる…。
作業を進めるうちに、端から中心までのマスが127個しか無いことに気付きました。そういえば、サイズは256だけど分解数は255でした。このままだと、テクスチャマッピングが若干ずれます。どうしたものか…。
A案:テクスチャの歪みを覚悟して続行する
→見た目には気付かない?
B案:分解数128で作り直す
→何かとバランスが良い
→見た目が粗くなるので避けたい
C案:分解数252(63×4)で作り直す
→最も無難?
D案:分解数256で作り直し、手動で頂点数を減らす
→均一的な削減は困難
→手間がかかる
→グレースケールを再作成するとやり直し
→パフォーマンスは向上する
E案:分解数256で頂点数を減らしたXNAモデルを作成する
→マップの初期設定が遅くなる
→作成工数がかかる
→パフォーマンスは向上する
F案:分解数256で作り直し、頂点削減ツールを作成する
→最も理想的
→XNAでモデルのファイル出力は困難であり非現実的
頂点数を削減するとパフォーマンスが改善できるので少し悩みましたが、とりあえずC案を実施し、様子をみながらD〜E案への移行を考えることにしました。
尚、‘頂点数を減らす’とは『周囲の高さが同じ頂点を削除する』ということです。荊州マップは平原が多いので、かなり減らせると思います。
◎グレースケールのピクセル数分解数252で再作成し、スケールを200倍で調整したのですが、いまいちズレるような気がします。
そこでまたプログラムを見直して考えたのですが、グレースケールのピクセル数は分解数+1とする必要があるのではないでしょうか?
というわけで、ピクセル数253、分解数252で試してみました。

やりました!ピタリ一致しました!
半ば諦めかけてましたが、やっと直りましたよ〜!
いかがでしょう?丘の向こうから出現する騎馬隊とか、いい感じじゃないですか?
◎次回予告次回は地形種別の取得です。これが終われば地形関連は一段落です。
ユニットの移動はまだ本格的にやりませんが、とりあえず川には入らないようにしたいですね。
テーマ : ゲーム製作 関連 - ジャンル : ゲーム
コメントの投稿