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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

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

C++

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

Q&A

解決済

2回答

497閲覧

行列の計算について、学ぶべき分野について教えてください。

hikarhikar

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/04/27 19:39

編集2020/04/27 19:43

ゲームプログラミングC++といる本にこのような記事があったのですが、
![イメージ説明
それぞれのボーンのローカル行列と、階層構想の親子関係がわかれば、ボーンのグローバル行列を計算できる
例えば、背骨の親がルートボーンならば、背骨のローカルポーン行列は、ルートボーンからの位置と方向である。
そして、ルートボーンのローカルポーズ行列は、グローバルポーズ行列と同じだ。
ゆえに、背骨のローカルポーズ行列(背骨local)に、ルートボーンのグローバルポーズ行列(ルートglobal)をかければ、
背骨のグローバルポーン行列(背骨global)がえられる。

(背骨global)= (背骨local)×(ルートglobal)

実際に

(背骨local)=(x,y)=(0,1)
(ルートglobal)=(x,y)=(2,2)

に設定して計算したのですが、どうやっても結果が、思ったようにならないのですが、どのように計算すればいいのでしょうか?
普通に
X=02=0
Y=1
2=2
とやったら、できなかったので、行列で計算するのかなと思い、独学で勉強してみて、行列の掛け算と拡大変換・回転変換・平行移動変換
など勉強したのですが、上の計算の結果(背骨global=x,y=2,3)にはたどり着けませんでした。
平行移動ならいけると思うのですが、平行移動は掛けるではなく、足す(opengl)なので違うかな~と...
単位行列を計算するのかなとも思ったのですが、ゲームプログラミングC++といる本に単位行列の子とは書かれていなかったので...
単位行列・逆行列は浅く学んでみたのですが、プログラムにどう作用しているのかわかりませんでした。<(_ _)>

例えばなのですが、変数Aという行列があり、それに逆行列をかけ代入したら、変数Aが保持する値が単位行列になってしまって、
元の値が消えてしまっていると思うのですが....
この変数A(単位行列の状態)に何をかけても、かけた値が返ってくると思うのですが...

変数A=
1, 2,5,
1,-1,1, * 逆
0, 1,2,

行列もプログラミングも初心者で、何が正しいのかわかりませんでした。
そもそも、行列の認識が違うのかもしれません。どの分野を勉強すればいいのでしょうか?
よろしければわかる方お教えください。<(_ _)>

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

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

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

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

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

thkana

2020/04/27 22:18

ゲーム屋やロボット屋ではないのでパッと出てくる回答はありませんが、 > 背骨のローカルポーン行列は、ルートボーンからの位置と方向である。 とあるのに > (背骨local)=(x,y)=(0,1) では位置? 方向? どちらかの成分しかなさそうに見えます。辻褄はあっているのですか? 行列の話はとりあえず数学の分野としては「線形代数」かな。
Zuishin

2020/04/27 23:52

とりあえずその本を読みたいところだけじゃなく全部読みましょう。そんな半端な読み方をしていたのではあと何冊読んでも同じです。
guest

回答2

0

拡大変換・回転変換・平行移動変換

一度,行列を使わない世界で(成分毎に書き下して)これらの変換を扱う式を書いてみてはいかがでしょうか.
で,行列で書いた場合と比較して,同じことをしているのだという対応を取ってみる感じで.


成分毎に式を書くと

  • x = ...
  • y = ...
  • z = ...

という形で成分の数だけ式が並びます.これを纏めて書いた表記が行列を使った式であるというだけです.

例えば2次元の世界で(x,y)を「拡大して,回転して,平行移動する」という計算は,成分毎に書いてみれば

  1. 拡大:s倍する

x' = s * x
y' = s * y
2. 回転:(原点まわりに)θだけ回転する
x'' = x'*cosθ - y'*sinθ
y'' = x'*sinθ + y'*cosθ
3. 平行移動:(tx,ty)だけ移動
x結果 = x'' + tx
y結果 = y'' + ty

上記を纏めると,

x結果 = x*(scosθ) - y(ssinθ) + tx
y結果 = x(ssinθ) + y
(s*cosθ) + ty

となります.
これを行列で書いたら以下になる.
元の座標(を表すベクトル)に,拡大縮小するための行列をかけて,それに回転するための行列をかけて,それに平行移動するための行列をかける.

[x結果] [1 0 tx][cosθ -sinθ 0][s 0 0][x] [x結果] = [0 1 tx][sinθ cosθ 0][0 s 0][y] [ 1 ] [0 0 1 ][ 0 0 1][0 0 1][1]

右辺の3つの行列の積を計算してまとめれば

[x結果] [s*cosθ -s*sinθ tx][x] [x結果] = [s*sinθ s*cosθ ty][y] [ 1 ] [ 0 0 1 ][1]

ですね.成分毎に書いた式と比較すれば「まぁ同じ内容だな」とわかるでしょう.

投稿2020/04/28 01:32

編集2020/04/28 02:03
fana

総合スコア11996

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

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

hikarhikar

2020/04/28 04:38

fanaさんご返信ありがとうございます。<(_ _)> なるほどです。 プログラミングで、実際に一つずつ紐解いていく感じでやってみたら、うまくいきました。 丁寧に説明していただき、ありがとうございました。(*´▽`*)
guest

0

ベストアンサー

こんにちは。
同じくゲーム屋でもロボット屋でもないので的外れな回答であれば申し訳ございません。
背骨local,ルートglobalは行列ですよね ?
二次元で考えるのであればその行列は四つの成分を持つような行列になると思いますが、実際に代入してやっているところでは(x,y)=(0,1)のように座標を与えているので間違えてると思います。

背骨localの(x,y)=(0,1)というのはローカル座標の背骨ボーンをy軸方向に1進めるという意味でいいのでしょうか?
それであれば背骨local行列はただの平行移動なので余分な1次元を加えて
100
011
001
として座標に左からかけてあげると
(x,y,1)という座標が(x,y+1,1)となるのでさらに左から
100
010
を掛けてあげると(x,y+1)となるのでこれで得られます。
つまりy軸に1だけ平行移動させるときにはこの二つの行列を掛け合わせた
100
011
を(x,y,1)に左から掛ければいいということですね。
基本的には線形代数の行列の計算方法、性質、またアフィン変換を使ってるのでそれらを勉強すればいいと思いますよ。

投稿2020/04/27 23:46

syalpon

総合スコア24

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

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

hikarhikar

2020/04/28 04:32

syalponさんご返信ありがとうございます。<(_ _)> 丁寧に教えていただき、すごい分かりやすくイメージ出来ました。(*´▽`*) 試しにいくつか計算してみたら、思うようにいきました。 これからも、線形代数について勉強していきたいと思います。ありがとうございました。
fana

2020/04/28 05:01

> さらに左から… というところの2行3列の行列を掛ける という話はちょっと強引感?
hikarhikar

2020/04/28 13:29

fanaさんご返信ありがとうございます。 3行3列に3行3列をかけ、最終的な値が3行3列になり、 これを繰り返していくということでしょうか?
syalpon

2020/04/28 23:24

少し突っ込まれていたので追記として書きます。 あまりプログラムでは意識しなくていいかもしれませんが、 (x,y)という2次元座標から(x,y+1,1)という3次元座標への変換したので必要な2次元分の(x,y+1)だけを取り出す為に2行3列の行列を左から掛けました。 扱う次元が2次元なのに返値が3次元であれば少し気になるかなと思い強引に掛け算を行いましたが、好みの問題かと思います。そのために説明は省いたのですが、確かに一言「扱う次元を二次元に戻すために」くらいは必要だったかなと思います。 また行列の積だけで表さなくて良いのであれば行列の足し算で二次元だけで議論が進むので、無理して行列の掛け算だけで表す必要もないと思います。
fana

2020/04/29 02:54

一応は同時座標で扱ってる形式なのに,「追加した次元の値を単純に無視して結果を取り出す」という形なのがちょっとひっかかっただけです. (平行移動みたいな変換であれば結果として問題ないのですが)変換行列の内容次第ではダメなので.
syalpon

2020/04/29 03:22

なるほど、言われてみればそうですね。 まぁ平行移動の為だけに1次元分増やすというのも少し気持ち悪いので素直にベクトルを足すことをお勧めしたいですが・・・。 結局のところ背骨globalとルートglobalの処理が非可換であるだけで、他は単純な座標の扱いだけなのでそこまで難しく考える必要もない気もします。
hikarhikar

2020/04/29 05:36

ご返信ありがとうございます。<(_ _)> 完全に理解出来ました!! 何から何までありがとうございました。(*´▽`*)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問