テクスチャの拡大縮小回転について
furafura 2014/10/16(Thu) 00:42
私なりにいろいろ挙動を調べておりましたが、理解不足で巧く行かない事があり、質問させていただきます。
例えば、270度回転した画像を表示する場合、
image.rotate270();
を使わないで高速に表示する方法は提供されているでしょうか。
『「目的」は、縦横比維持の拡縮と回転(90度単位)を同時に行いたい』のです。
rotate
と
rotateAt
がありますが、roteteの回転軸は画像の中心付近でしょうか?
私の目的に一番近そうな挙動のものは、
// 表示位置 大きさ=倍率 中心指定による回転角度
Rect(ImagePutX, ImagePutY, ImagePutWX, ImagePutWY).rotateAt(0, 0, Radians(0.0))(ScreenTexture).draw();
なのですが、rotateAtがテクスチャ内ピクセル(0,0)を中心に回転している感じがしないのですが、間違いでしょうか?
また、テクスチャを
main()
外のグローバル変数として用いると、終了時に例外のエラーが出ます。
アセットを使うとimageからテクスチャを生成出来ないと思います。
アセットの使い回しは出来ないようです。
(いずれも仕様と推測します)
Quadを用いると頂点移動で実現出来そうに思いますが、使い方が分かりません。
細々と書きましたが、良い方法がございましたら、教えて頂きたいと思います。
Reputeless 2014/10/16(Thu) 12:57
質問を整理します。
[Q1]
縦横比維持の拡縮と回転(90度単位)を同時に行いたい
[A1]
スケーリングと回転を次のように組み合わせます。
# include <Siv3D.hpp>
void Main()
{
const Texture texture(L"Example/Windmill.png");
while (System::Update())
{
const int degree = Mouse::Pos().x;
Window::SetTitle(Format(L"回転: ", degree, L"°"));
texture.scale(0.5).rotateAt({ 0, 0 }, Radians(degree)).draw();
// 画像の中心が回転軸
//texture.scale(0.5).rotate(Radians(degree)).draw();
}
}
[Q2]
rotete の回転軸は画像の中心付近か?
[A2]
Texture::rotate() の回転軸は画像の中心、Rect::rotate() の回転軸も長方形の中心です。
[Q3]
Rect(ImagePutX, ImagePutY, ImagePutWX, ImagePutWY).rotateAt(0, 0, Radians(0.0))(ScreenTexture).draw();
なのですが、rotateAtがテクスチャ内ピクセル(0,0)を中心に回転している感じがしないのですが、間違いでしょうか?
[A3]
間違いです。
質問のコードでは Rect(ImagePutX, ImagePutYm, ImagePutWX, ImagePutWY) ですでに長方形が移動していて、それを画面の (0, 0) を軸に回転しています。
この場合は、拡大縮小、回転してから移動するときれいに書けます。
# include <Siv3D.hpp>
void Main()
{
const Texture texture(L"Example/Windmill.png");
while (System::Update())
{
const int degree = Mouse::Pos().x;
Window::SetTitle(Format(L"回転: ", degree, L"°"));
texture.scale(0.5).rotateAt({ 0, 0 }, Radians(degree)).draw(100, 100);
}
}
[Q4]
Quadを用いると頂点移動で実現出来そうに思いますが、使い方が分かりません
[A4]
quad(texture).draw() で Quad に Texture を貼り付けて描画できます
# include <Siv3D.hpp>
void Main()
{
const Texture texture(L"Example/Windmill.png");
const Quad quad1 = Rect(200, 200).rotate(0.5);
const Quad quad2 = Rect(300, 200, 300, 200).rotate(0.5);
while (System::Update())
{
quad1(texture).draw();
quad2(texture(0, 0, 300, 300)).draw();
}
}
[Q5]
Texture をグローバル変数として用いると終了時にエラーが出る
[A5]
Siv3D May 2014 v2 まではアセットをグローバルで作れない制限があります。
近日リリースする次期バージョン(Siv3D NEXT) でこの問題を解消しました。
ただし、グローバル変数を使う設計は、
オブジェクトを破棄するタイミングをコントロールできないため、本来は避けるべきです。
[Q6]
TextureAsset を Image から作りたい
[A6]
今後実装を検討します。
---------------
もし以上の回答で解決しない場合は、また返信をください。
furafura 2014/10/16(Thu) 22:42
お忙しい中、整理の上回答下さいまして申し訳ありません。
グローバル変数への見解は私も同様です。
twitterも拝見しておりますが、NEXTに期待しております。
今回教えて頂いた内容を、理解した上で試させて頂きます。ありがとうございました。