テクスチャの拡大縮小回転について
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に期待しております。

今回教えて頂いた内容を、理解した上で試させて頂きます。ありがとうございました。

- WEB PATIO -