質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1339閲覧

中心を中心に回転して最後元に戻る行列の計算知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/05/10 11:00

編集2021/05/10 11:28

提示コードのsetRotate関数部ですが原点を中心に回転させて最後それを戻しているのですがなぜ座標がおかしくなるのでしょうか?この関数をどうすれば真ん中を中心に回転して最後元に戻せるのでしょうか?いろいろいじりましたがわかりません。

イメージ説明

cpp

1//回転 2void FrameWork::Transform_2D::setRotate(float a) 3{ 4 5 6// std::cout << size.x << std::endl; 7 glm::mat4 m = glm::translate(translate, glm::vec3(size.x / 2.0f, size.y / 2.0f, 0)); //平行移動 8 rotate = glm::rotate(m, a, glm::vec3(0.0,0.0,1.0)); //回転 9 10 //m = glm::translate(translate, glm::vec3(-size.x / 2.0f, -size.y / 2.0f, 0)); //平行移動 11 m = glm::translate(m, glm::vec3(-size.x / 2.0f, -size.y / 2.0f, 0)); //平行移動 12 rotate = glm::rotate(m, a, glm::vec3(0.0, 0.0, 1.0)); //回転 13 14 15} 16

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2021/05/11 06:34

回答作成中に削除申請をされたようで、回答直後、内容の確認ができない状態になりました。 質問から1時間もせずに削除申請する程度なら、質問しないという選択を、もっと真剣にご検討ください。
guest

回答2

0

ベストアンサー

とりあえず提示されたコードの注釈部分を除去すると,こんな形↓です

glm::mat4 m = glm::translate(translate, glm::vec3(size.x / 2.0f, size.y / 2.0f, 0));
rotate = glm::rotate(m, a, glm::vec3(0.0,0.0,1.0));

m = glm::translate(m, glm::vec3(-size.x / 2.0f, -size.y / 2.0f, 0));
rotate = glm::rotate(m, a, glm::vec3(0.0, 0.0, 1.0));

上から順に見ていきます.

  • 1行目

m = translate * 並進行列
という話です.
translateの中身が何なのかは不明ですが.

  • 2行目

rotate = m * 回転行列
という話です.

  • 3行目

m = m * (1行目とは真逆の並進量の)並進行列
となっています.
なので,1行目と3行目の処理をまとめれば,(2つの並進が相殺し合って)結局は
m = translate
という形になっていると思われます.

  • 4行目

rotate = m * 回転行列
です.
rotateを上書きしているので,2行目の存在は無意味です.
この時点での m は前述の通り,translate と同値と思われるので,1~4行目の全てをまとめれば,
rotate = translate * 回転行列
という話です.

以上より,この4行は,
rotate = glm::rotate( translate, a, glm::vec3(0.0, 0.0, 1.0) );
と同じ意味であるように思われます.

真ん中を中心に回転して最後元に戻

という言葉の意味はよくわかりませんが,
このrotateが,行いたい変換と合致しているのか否かを今一度確認されると良いのではないでしょうか.

投稿2021/05/11 05:24

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

本来の意図が、平行移動>回転>逆平行移動>逆回転だと、仮定します。
(実際のコードに関しては、回転を反映させているだけのようですが)
なお、意図が異なるようなら、その意図をご説明下さい。

この手順では、戻らないのが当然です。なぜ、この処理で戻ると判断されたのか、理解に苦しみます。

例:適用前(1,1)、X+2移動、90度回転の場合
平行:(3,1)
回転:(1,-3)
逆平行:(3,-3)
逆回転:(3,3)

以下で写像に関しての理解をしてください。
変換

投稿2021/05/10 11:46

編集2021/05/11 06:03
YT0014

総合スコア1750

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2021/05/11 05:05

回答内容が全体的によくわからないです. [1] 提示された例で -4 という値が突然出てきますが,これはどのような話によるものでしょうか? (-5 の間違いでしょうか?) [2] > 逆回転 とは何でしょうか? 質問のコードで言うところのどの部分に相当しますか? [3] > 平行移動>回転>逆平行移動>逆回転 (質問のコードは一部のみしか無いので確かなことは不明ですが) そのような変換だとは読み取れないように思います.
YT0014

2021/05/11 05:30

1:間違えました。-5なので、修正させていただきます。 2:質問文からですが、コードから見ると、(正)回転ですね。 3:質問文とコードからの推測です。誤りがあれば、申し訳ございません。
YT0014

2021/05/11 05:33

なお、回答投稿時、既に質問文の削除依頼がなされたため、本日まで確認も修正もできなかったという事情がございました。ご配慮頂ければ幸いです。
fana

2021/05/11 05:40

質問コードの私なりの解釈を回答として書きましたが, rotate = ... が2回登場しているものの,その2つの間では rotate が参照されていない様子ですので, 結局1回目の側は全く無意味であり,有効な回転の記述は後者側のみになるように見えます. そんなことになっている時点でとてもまともなコードとは言えない気がするので, 質問コードから「何が正しくて何が違うのか?」とかを考えるだけ無駄であるような気もしてきました.
YT0014

2021/05/11 06:09

こちらでもコードを読み直して、連続して反映させていないのに気づき、あきらめて、推測した意図を前提にしました。質問文とコードからだと、こういう意図であるように読めるので。
fana

2021/05/11 10:08 編集

結局,意図(本当にやりたい変換とは何か?)が不明なので,どうでもいい話になりますが… glm::translate() とか glm::rotate() とかは 第1引数の行列に,第2引数以降から作った変換行列を掛けた結果を返すわけですが, この掛ける方向というのが, 「前者の行列 * 後者の行列」 すなわち「新しく計算した変換行列を既存の行列に対して右から掛ける」という形のようです. なので,もしも質問コードの4行がまともに連なっていたとしたら, 「最終的な行列 * 座標ベクトル」 みたいにして使われる場合,変換の順序というのは 回転→並進→回転→並進 という,コードに現れている順序とは逆順の形になります. (OpenGL 1系の glRotated() とか glTranslated() とかと同じような雰囲気ですね)
YT0014

2021/05/11 11:28

>「最終的な行列 * 座標ベクトル」 誤解しておりました。ご教授ありがとうございます。 座標系が必要な開発から遠ざかっているので、参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問