Texture to Polygon
Rinifisu  2014/11/06(Thu) 18:30
名前の通り、描画する範囲やサイズ、回転座標等を決めて変更したTextureをPolygonに変換する簡単な処理方法を探しています。
Image to Polygonを行えるようにするため、Textureをスクリーンショットで無理やり取り出してImageに変換する処理を行っていましたが、高負荷がかかって効率は最悪でした。
何か簡単な方法あれば知っておきたいです。

「設定適応済みの画像の透明部分を無視した当たり判定を行いたい」です。
Reputeless  2014/11/06(Thu) 21:44
Image to Polygon は事前に用意した画像に対して使うことを目的としていて、
リアルタイム(毎フレームの頻度)で使われることは想定していません。

Image to Polygon で 作成した Polygon を移動したり回転したりすることで、
ほとんどの場合は対応できると思われますが、いかがでしょうか。
Rinifisu  2014/11/07(Fri) 09:19
「チュートリアル | テクスチャの描画」
http://play-siv3d.hateblo.jp/entry/tutorial/drawTexture

このページの「テクスチャの一部を描く」のように指定した範囲だけを取り出す処理がImageで出来れば実現できそうですがそのやり方がよくわかっていません。

「今まで行っていたやり方」
Texture読み込み -> 描画する範囲やサイズ、回転座標等を決めて変更 -> 変更後のものをスクリーンショット -> Imageとして再読み込み -> Polygonに変換してあたり判定

「最初にできればと思っていたやり方」
Texture読み込み -> 描画する範囲やサイズ、回転座標等を決めて変更 -> Polygonに変換してあたり判定

「今回ご指摘いただいたやり方」
Image読み込み -> Polygonに変換 -> サイズ、回転座標等を決めてあたり判定

「今回わからなかった点」
Image読み込み -> Polygonとして使用する画像の範囲を設定(???) -> Polygonに変換 -> サイズ、回転座標等を決めてあたり判定

添付した画像の例えば「AAAAAA」の部分のみをImage to Polygonになど範囲指定ができれば実現できそうです。


現在制作しているゲーム全体の画像管理がTextureAssetに画像1枚を登録して、その登録名を各クラスに保存しておいて描画するというポインタのような扱い方をしており、ImageAssetが存在しないので、実装するとすれば作り直さなければならないので今回の質問に至ったことも理由としてあります(独自処理を行った自分のせいですが)

Circleで当たり判定を使う処理も考えていましたが、CircleのrotateAt等がないのでやはりImage to Polygonを使うしか方法がないです。



Reputeless  2014/11/07(Fri) 14:33
Image::getRect() で Image の必要な部分を切り抜き、
Image to Polygon を適用してはいかがでしょうか。

XXXXAsset に頼らずとも、Image や Image to Polygon の結果は、
std::shared_ptr を使って効率的に各クラスで共有できると思います。
Rinifisu  2014/11/08(Sat) 11:46
Image::getRect()でそのままのサイズの場合の当たり判定は成功しました。

しかし、描画用にTextureとImageを両方用意する必要があり(Imageのみだと描画時にImage経由でTextureを大量に生成破棄するため)、メモリ負担が増加する点と、getRectで取得したImageのサイズ変更ができない(わからない)ため、現在試行錯誤中です。

- WEB PATIO -