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

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

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

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

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

Q&A

解決済

3回答

1654閲覧

モデル行列はどういった理由でこの順番なのか知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

3DCG

コンピュータの演算により、3次元空間の仮想物体を、2次元平面上で表現する手法である。

0グッド

0クリップ

投稿2021/06/26 05:16

モデル行列の掛け算ですが以下ようにやることは学んだのですがなぜこの順番なのでしょうか?場合によって異なるのでしょうか?

###知りたいこと

######1 提示サイトではかける順番が逆とあるのですがこれはどいうことのでしょうか?プログラムの場合と数式の場合とでの違いが知りたい。
######2 かける順番の理由が知りたい

参考サイト: http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-3-matrices/#%E8%A1%8C%E5%88%97%E3%81%AE%E7%B5%84%E3%81%BF%E5%90%88%E3%82%8F%E3%81%9B%E3%83%A2%E3%83%87%E3%83%AB%E3%83%93%E3%83%A5%E3%83%BC%E5%B0%84%E5%BD%B1%E8%A1%8C%E5%88%97

cpp

1 glm::mat4 m = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector;

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

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

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

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

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

guest

回答3

0

ベストアンサー

モデル行列の掛け算ですが以下ようにやることは学んだのですがなぜこの順番なのでしょうか?

多くの場合,Translationを最後にした方が考えやすいだろう,とは思うが
「その順番じゃないとダメです」という絶対的なルールがあるわけじゃないので,好きにやればいいです
別の順でやると,その提示サイトで

間違ったやり方

とか書かれているような話になって面倒かもね,というだけのこと.
(面倒なだけであって,この順序だと絶対にダメという話ではない.その順序で乗じれば所望の結果を生むようなマトリクスを用いさえすればよい.ただし,それらのマトリクスは単純な名前で呼べない物にはなり得るかもしれない.)

例えば,モデル変換を

変換後座標 = R * S * T * 変換前座標

だとしようが,別にどうでもいい.
単に,この演算が所望の結果を生むような{ R, S, T }を用いればよい.
Tについて言えば,「後から S でスケーリングされて,さらに R で回転された結果が所望の位置にくるような並進」であればいい.
(前述したように,Translationを最後にする場合のほうがずっと考えやすいだろうけども)

"MVP" という字面と,
"Projection * View * Model" という乗算での項の並び順が
「見た目に」逆だ,ってだけの話かな,と思う.

多分,提示されたサイトのもっと前のページに「逆」という言葉の出所があるんだろうと見えるけど,探すのも面倒なので,興味があるなら遡って読んでみては?

個人的には,
この「逆」とか何とかいう言葉自体はかなりどーでもいいと思う.
「逆だから~」とかいう話から物事を考えるような覚え方では何も分かってないのに等しいから,そんな暗記っぽい話は捨ておいてよい.
演算の内容をまともに把握していれば「逆」とか何とかいちいち言わないし言う価値も無い.

投稿2021/06/28 01:34

編集2021/06/28 01:42
fana

総合スコア11654

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

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

退会済みユーザー

退会済みユーザー

2021/06/28 01:43

つまりどの順番でやるべきなのでしょうか?好きにやればいいとありますが行列はかける順番で結果が変わると思いますが?
fana

2021/06/28 01:47

うん,だから 【「かける順序」 と 「各行列が司る演算内容」 の組み合わせ】パターンが何通りもある中で, ご自身が一番扱いやすいと思うやつを用いればいいんじゃない? 回答に書いたように,Translationを最後に乗じる形がやりやすい(回転とスケールの順序はどっちでもいい)と思うけど.
fana

2021/06/28 02:01 編集

行列を3つにしろ,ってルールすらない. 何をどう乗じようが,最終的に所望の結果になるならばOKっしょ. ある変換の逆変換を考えたりする場合には,同一の順序ではなくなる(とも言える)のだし.
fana

2021/06/28 03:39 編集

まぁ,参考サイトの話から逸脱せずに行くならば,書かれている通りにやっとけばいいわけですが, 乗じる順序の意味については, そのサイトで「間違ったやり方 」とか書かれているあたりの話をちゃんと理解すること. --- なんつーか, > なぜこの順番なのでしょうか? という話が,捉え方が違うと思う. 「個々の行列を何となく用意してみたけど → さて,こららをどの順序で乗じればいいのか?」 なんて馬鹿な話は無い. 「まず,座標変換に用いる式(順番)を決めた → その順番に見合うように各行列内容を用意した」 という話だ.
退会済みユーザー

退会済みユーザー

2021/06/28 02:23 編集

提示コードですが > glm::mat4 m = TranslationMatrix * RotationMatrix * ScaleMatrix * OriginalVector; 部ですが参考サイトではスケールから順番に掛け算するとありますがそれを確認するために関数に置き換えてprintfを使い実行される順番を確認しましたが平行移動から実行されるのですが参考サイト通りにスケールから順番になりません。どういうことでしょか?
fana

2021/06/28 02:16

何をやってどうなったという話なのかがわかりません.
guest

0

openglに詳しくありませんが、一般に行列の掛け算は順番に依存します。

たとえば正方行列AとBがあったとき、積ABと積BAは同じになるとは限りません。推測ですが、資料の中での数式表現とプログラムの実装では逆になるという意味だと思います。

ついでに(本題と関係ありません)

アフィン変換のプログラムの利点の一つは計算処理を単純化できることです。ご提示の資料ではこの利点を全く利用しておりません。

例えば、平行移動、拡大縮小処理・・・といった各処理を行列A、行列B、行列C・・・と数式化するとします。一方、座標点をv0,v1,v2・・・とします。通常、座標点数は幾千幾万という数がありますが、行列の数は百に満たない程度です。

こうすうと、処理行列A、B、C・・・を事前に乗算して合成行列Xとしておけば計算が楽になります。各座標点に対してXを乗算すれば良いので、計算ステップ数が大きく節約できます。これはアフィン変換でない行列計算では実現できません。拡大縮小は行列の掛け算ですが、平行移動は行列の足し算なので、合成行列Xを事前に計算できません。

投稿2021/06/26 05:34

HogeAnimalLover

総合スコア4830

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

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

fana

2021/06/28 02:19

> ご提示の資料ではこの利点を全く利用しておりません。 とのことですが,最終的な合成行列をシェーダで利用するという話に見えますよ. 同次座標を扱っているので並進も合成されていますし,最終的に全ての変換を行う単一のマトリクス MVP を利用して演算する形になっています.
guest

0

Model, View, Projection をその順に x にかけると:

x = Model * x
x = View * x
x = Projection * x

これを一気にやると
x = Projection * (View * (Model * x))
カッコを外すと
x = Projection * View * Model * x

御覧の通り、かける順序が(MVPの)逆になる。

...ってことなのでは?
※ 数学の問題じゃんコレ。

投稿2021/06/26 12:41

episteme

総合スコア16614

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

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

HogeAnimalLover

2021/06/26 12:55

?カッコを外して計算順が逆になったとしても、それが計算結果に影響を与えることはありません(結合律)。一方、正方行列の掛け算は交換律を持たないので、右左が入れ替わると計算結果が変わります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問