タワーディフェンスの構想など

ようやくタワーディフェンスの開発に取り掛かりました。
今回は思い切って3Dです。

 

タワーと呼べるかどうかも怪しい出来になりそうですが、
3D空間上にブロックを配置していって迷路を作りつつ敵を撃退する…ようなのを想定してます。

ちなみに3D表示は自前のソフトウェアレンダラ(CPUで描画する)を使ってます。
数年前のを引っ張り出してきてゲームでも使えるよう修正しました。
CPU描画なのであまり無茶はできないですが、
ローポリかつフィルタリング無しならフルテクスチャでも行けそうな。

 

ちょっとゲームとは関係ないですがテクスチャの透視補正についてのお話を。

Papervision3DとかProcessingの3Dとかを触ってた人は知ってるかもしれないですが、
大きなポリゴンにテクスチャを貼って近くで見るとテクスチャが歪みます。


今となっては珍しい現象

丁度対角線あたりで折れ曲がってるのが分かるかと思います。
四角形は直接描画できないので三角形二つに分割するためですが、
それぞれのテクスチャにパースがかかっていないのが原因です。

三角形を描画する際には、UV座標などのデータを
三つの頂点のデータから線形補間 (=適当に混ぜ合わせる) して求めます。
線形ということは、全ての場所で等間隔にピクセルが現れることを意味します。

別に正面から見ていれば何ら問題はないのですが、
斜めから見てみるとおかしなことが起こります。

斜めから見たとき、手前のピクセルほど間隔が広く、
遠くのピクセルほど間隔が狭くなっているはずですが、
このときも等間隔にピクセルが並んでしまいます。

つまり線形補間では奥行きを表現できないのです。

ではどうすればいいかというと、正しい補間をしてやればいいんです。
三次元上の物体を画面上に表示する時、プロジェクション変換という段階で
縦横の座標をカメラからの距離で割る処理をしています。
この段階で縦横の座標はカメラからの距離の逆関数となり、非線形になります。
画面上の非線形な空間で線形に補間をしようとした結果、歪みが生じたわけです。

そこで、UV座標もカメラからの距離で割ってやり、縦横の座標との関係を揃えておきます。
もちろんそのままでは使えないので、使う直前にもう一度割って元に戻します。
これでテクスチャでも奥行きが表現できます。


正しくマッピングするとこうなる

難点としてはピクセル単位で除算が発生することですが、
工夫することによって負荷を軽減できます。

3 Responses to “タワーディフェンスの構想など”

  1. もちもち より:

    なんか凄い事になってまいりました。
    これは期待。

  2. Name より:

    3D・・・だと・・・

  3. マオ より:

    3Dか!期待!!!

Leave a Reply for もちもち