使える数学

回転行列、拡大縮小行列、平行移動行列(三次元座標の場合)

二次元座標(X,Y座標)の場合のアフィン変換行列についてはこちらで説明しましたが、今回は三次元座標(X,Y,Z座標)のアフィン変換となります。

三次元座標の場合、まず座標軸の定義、回転方向の定義を明確に覚えます。

三次元座標の定義

この座標は右手座標系と呼ばれます。
フレミングの法則のときのように右手親指人差し指中指をそれぞれ
直交するようにします。
このとき親指から順に親指がX軸人差し指がY軸中指がZ軸の方向と
なります。
回転方向は電流と磁界の向きと同じように電流軸の向き磁界回転方向
に相当します。(右ねじの法則と同じです。)

 

回転行列

三次元の回転行列の前に二次元の回転行列のおさらいです。
二次元の回転行列は以下の通りとなります。

 

二次元座標の回転

 

これをベースに三次元座標の場合では、回転する軸の正の方向から原点の方向を見たときに、X軸、Y軸はそれぞれ何軸に相当するのか?を考えれば、二次元座標のXやYの変数の置き換えで導き出すことができます。
行列変換しない軸に関しては単位行列でそのまま残します。

 

【X軸周りの回転】
X軸周りの回転

【Y軸周りの回転】
Y軸周りの回転

【Z軸周りの回転】
Z軸周りの回転

拡大縮小行列

点(x, y, z)を原点に関してX軸方向に、Y軸方向に、Z軸方向にZする行列は

拡大行列

 

平行移動行列

点(x, y, z)をX軸方向に、Y軸方向に、Z軸方向にZだけ移動する行列は

平行移動

 

補足

三次元の座標変換に関して検索すると座標変換は下記のように

行ベクトル

行ベクトルで表記される場合もあるのですが、変換行列の値が変わるので、
混同しないようご注意下さい。
この表現はマイクロソフトがお得意で、DirectX(Direct3D)や.NETのアフィン変換でしか使われないので、特に必要の無い場合は覚えない方が無難です。

 

関連記事

二次元座標のアフィン変換についてはこちら↓にまとめています。

アフィン変換(平行移動、拡大縮小、回転、スキュー行列)
画像の拡大縮小、回転、平行移動などを行列を使って座標を変換する事をアフィン変換と呼びます。 X,Y座標の二次元データをアフィン変換するには、変換前の座標を(x, y)、変換後の座標を(x',y')とすると回転や拡大縮小用の2行2列の行列と、...

 

使える数学へ戻る

 

コメント

  1. mrrclb48z より:
    • Akira より:

      ちょっと面白そうだったので、自分なりに解いてみましたが、中学校入試の問題でなければ、三角形PQRの面積をベクトルPQとベクトルQRの外積で求めて、外積から三角形の面に対する単位法線ベクトルを求めて、法線ベクトルとベクトルPSとの内積で三角形PQRの面からSまでの高さが出るので、あとは、三角形の面積と高さで三角錐の面積を求めちゃいますね。

      という発想は、たぶん、三次元グラフィックスをやっている人なら、やりそうなパターンですね。

  2. yuki より:

    ご回答ありがとうございます。

    例えば、四角形の立方体を画面中心に置き、3次元の移動や回転したりしたいのです。
    軸を固定するのではなく軸も回転させたいです。
    説明が分かり辛く申し訳ありません。

    色々と試してみます。

    動画やunityのリンクありがとうございます!
    参考にさせていただきます。

  3. yuki より:

    お世話になっております。
    いつも楽しく勉強させてもらっています。

    現在c#で3D描画を勉強しています。
    3次元のxyz軸それぞれの回転計算式は分かるのですが、
    ではその計算結果をどのようにしてPictureBoxなどのx,yの
    2次元座標空間に落とし込めばいいのかが理解できないでいます。

    お手数なのですが、x,y,z飲みは3つの座標をx,yに変換する方法を
    ご教示いただけないでしょうか?

    以上、よろしくお願いいたします。

    • akira より:

      yukiさん、コメントありがとうございます。

      3Dで、どんな物をどのように表示するか?でやり方が変わってくるのですが、

      ●三次元座標の点を表示したいだけなら
      ここの記事で紹介している三次元座標のアフィン変換にさらに追加して、表示用のアフィン変換を掛けた結果の座標(x,y,z)の(x,y)だけを描画すれば、Z軸方向から見た座標をPictureBoxに表示できると思います。

      ●ポリゴン(三角形の面のあつまり)で立体を表示したいなら
      私のブログでは紹介していませんが、Direct3DやOpenGLを使う事になると思います。
      やり方は、コメント欄でお教え出来るほど単純では無いため、別のブログや書籍を参考にしてみてください。
      ちなみに、仕事でやった内容ですが、OpenGLを使って、C#のプログラムに表示した例の動画です↓
      https://youtu.be/L3kzdWcsAp0

      ●その他
      私はやった事がありませんが、Unityを使って3D表示ができるかも?しれません。
      https://docs.unity3d.com/ja/2018.4/Manual/vuforia_get_started_displaying_3d_content.html

      ご参考まで。

タイトルとURLをコピーしました