変形スプライトと疑似3Dと3D

ためしに4点の座標を指定するメソッド、Window.drawMorphを実装してみた。

require 'dxruby'
image = Image.load("enemy2.png", 0, 0, 128, 64)
Window.loop do
  Window.drawMorph(0, 50, 220, 5, 200, 120, 10, 80, image)
end


あれ、画像とコードがちょっと違うな・・・まあ例ということで。


DXRubyではDirectX9のポリゴン描画を使って2D描画を行っている。
ポリゴンは基本的に三角形で、2Dのスプライトを描画するためには三角形を2つ組み合わせる必要がある。
テクスチャは三角形の頂点それぞれに、テクスチャ画像の位置を指定することで貼り付けることができる。
要は三角形のポリゴンに三角形のテクスチャを貼るわけだ。
正方形の絵の頂点一つをぐぐーっと引っ張ってイビツな形にした場合、三角形のポリゴンに貼られるべきテクスチャは三角形ではなくなる。
矩形のスプライトがポリゴン2枚で表現していて、三角形それぞれにテクスチャが適用されるのだから、それを組み合わせた変形スプライトは、四角形の変形として想像できる結果にはならない。


例えばポリゴン2枚に1枚のテクスチャを貼るような機能があれば解決なのだが、探してみてもなんだか無さそうだ。
1ポリゴンスプライトを使ってうまいこと三角形の頂点を計算すればできそうな気もする。
が、左上・右上・左下を指定する1ポリゴンスプライトでは、右下が指定の位置にくるように座標を計算するのが異様に大変だ。
これを書いてる今は引越し直後でネットが繋がらないので、調べられない。


同様に疑似3Dをするときにも、4点の座標を指定できるようにすると問題になる。
きちんと四角形に指定してくれればいいが、そうじゃないとテクスチャが歪むし、3D空間上に配置するから平面に4点が並んでないと折り目ができてしまう。
だからポリゴンは三角形が基本なんだろう。
疑似3Dを作るときは基点位置と回転角度を指定するようにしないといけない。
真面目に3Dをするならポリゴンは三角形にすることになる。


なんにせよ、四角形の絵を変形させるのは一筋縄ではいかない。
簡単に実現する手としては、テクスチャを貼らずにフラットシェーディングのポリゴン描画のみ対応にするとか。
しかしこれは用途が微妙だ。
スペースハリアーの背景描画ぐらいしか思いつかない。
そういえばImageクラスの描画にそういった機能が無い。
高速な塗りつぶしがあればいいのだろうが、昔のBASICのPAINT命令みたいに使いにくくなってしまうから、3点もしくは4点を指定する描画があるといいかもしれない。
アルゴリズムはめんどくさそうだ。


結局のところ、四角形の4点を自由に指定してテクスチャを貼れれば使い道は多そうではあるが、実現性が薄いのと、代替案がイマイチなところが問題だ。
変形スプライトは捨てて疑似3Dに対応したほうが早いか。