コミュニティアイコン プチコン 非公式コミュニティ トピック

アバター
MIKE猫Soft ◆M1HxkK9fMI2A
2019/8/3 22:25
質問
3次元空間におけるオブジェクトの変換作業について
回転、スケーリング、平行移動の仕組みがいまいち分かりません。(*゚ρ゚)
ベクトルだの、アフィン変換だの、オイラー角が特定の角度でジンバルロックを起こすだの、クォータニオンっていう何か凄そうなものだの、色々調べましたが全く持って分かりません。
上三つ(スケーリング、回転、平行移動)の変換が高速に出来るようなものを考えていました
誰か詳しい方、中学生に分かるレベルで教えてください(えw

コメント

アバター
こういち 2019/8/3 23:03 ◆ou0jbJnEJ0Kb
まずは一番簡単な平行移動から
三次元上の座標をx,y,zとして、a,b,cだけ移動させたい場合、
x+a
y+b
z+c
で実現できます。
簡単でしょ?
アバター
こういち 2019/8/3 23:08 ◆ou0jbJnEJ0Kb
スケーリング
x,y,zをそれぞれの軸に対してa,b,c倍したい場合、
x*a
y*b
z*c
です。
大体の場合は平行移動と組み合わせられます。
アバター
こういち 2019/8/3 23:18 ◆ou0jbJnEJ0Kb
回転の前にベクトルとアフィン変換について。
アフィン変換とは
回転、拡大、縮小、平行移動、反転や、それらを組み合わせたものをアフィン変換といいます。ちなみに、アフィン変換のうち、平行移動を含まないものを線形変換と言ったりします。

ベクトルとは
大きさと向きを持った量です。
矢印をイメージすると分かりやすいと思います。
普通ベクトルは始点が決まってませんが、ある基準点を始点としてやることで、座標として扱うことが出来ます。座標を表すベクトルを位置ベクトルと読んだりします。
逆に、座標から基準点の座標を引くことで、位置ベクトルを求めることも出来たりします。
プログラムでは、ベクトルのxの大きさを表す変数と、yの大きさの変数の2つの変数で表せます。
座標(の差)と同じようなものと考えてもらって問題ないです。
アバター
こういち 2019/8/3 23:37 ◆ou0jbJnEJ0Kb
回転について
回転は結構難しいです。
あと、どんな回転をしたいかによって、やるべき内容も変わってきます。

例えば、x軸,y軸,z軸(またはそれに平行な軸)を中心に回転させたいなら、四元数よりも簡単に回転させる方法がありますし、
それ以外のある軸があって、その軸を中心に回転させたいなら、四元数というものをやるのが手っ取り早いです。

回転に入る前に前に確認
累乗(2乗だけで十分)は分かりますか?
三角関数は分かりますか?
分からなくても大丈夫ですが、分かっているなら説明が楽。
アバター
みなつ 2019/8/4 1:50 ◆hJTkStjweib1
座標の変換はベクトルで考えるとすごい簡単です(≧∇≦)b
ベクトルは矢印です。
二次元ベクトルはx方向とy方向の大きさを持った矢印で、
三次元ベクトルはx方向とy方向とz方向の大きさを持った矢印です。

ベクトルは矢印なので根本と先っちょがありますが、根本の位置は気にせず、根本から先っちょまでの大きさだけを考えます。(ただし「位置ベクトル」は根本を原点に置いた状態です。)

単位ベクトルは大きさ1の矢印です。どんな方向を向いていても大きさが1なら単位ベクトルです。
ここで、x軸方向の単位ベクトルi(成分は(1,0))と、y軸方向の単位ベクトルj(成分は(0,1))を考えます。

空間上の点P(x,y)は、単位ベクトルi, jに大きさを掛けて足して、
点P=x*i + y*j
と表せます。

■スケーリングとは
単位ベクトルi, jをそれぞれ4倍にしたベクトルA, B(これは大きさ4なので単位ベクトルではありません)を考えます。先ほどの式のi,jをA,Bに置き換えて、
点P2=x*A + y*B
と変換してみます。点P2の成分は
P2=x*(4,0) + y*(0,4)=(x*4, y*4)
で、点Pの座標を4倍した位置です。これがスケーリングです。

■回転とは
ベクトルi, jをそれぞれ30度だけ回転したベクトルC, Dを考えます。
ベクトルCの成分はベクトルi(1,0)を30度回転したものなので(cos30度, sin30度)、ベクトルDの成分はベクトルj(0,1)を30度回転したものなので(-sin30度、cos30度)になります。(C,Dは大きさ1なので単位ベクトルです。)
先ほどの点Pの式のi,jをC,Dに置き換えて、
点P3=x*C + y*D
と変換してみます。点P3の成分は
P3=x*(cos30度, sin30度) + y*(-sin30度, cos30度)=(x*cos30度-y*sin30度, x*sin30度+y*cos30度)
になります。これが回転です。

結局スケーリングと回転は同じで、点Pの座標を単位ベクトルi, jの合成で表していたものを、別のベクトルの合成におきかえる変換です('ω')
アバター
みなつ 2019/8/4 1:54 ◆hJTkStjweib1
■平行移動とは
(10, 5)の成分を持つベクトルQを考えてみます。
点Pの式にベクトルQを足して、
点P4=x*i + y*j + Q
と変換してみます。点P4の成分は
P4=x*(1,0) + y*(0,1) + (10,5)=(x+10, y+5)
となります。これが平行移動です。

平行移動はスケーリングや回転と違い、単位ベクトルi,jを置き換えるのではなく、単に移動量分のベクトルを足す変換です(*'ω'*)

なお、二次元で説明させて頂きましたが、三次元でもz成分が増えるだけで、基本的には同じです。
ただし、二次元の回転は1種類ですが、三次元の場合ははいろんな軸を中心に回転できます。その場合でも、各軸方向の単位ベクトルを、回転後の単位ベクトルに置き換える、という考え方は変わりません(≧∇≦)b
アバター
MIKE猫Soft 2019/8/4 8:54 ◆M1HxkK9fMI2A
>>こういちさん
三角関数と累乗は知ってます。
勿論ベクトルの大きさや、各軸の方向の求め方も知っています。(調べた
>>みなつさん
分かりやすい説明ありがとうございます。
ベクトルを扱うと、ベクトルの大きさと向きを操作するだけで座標変換が出来るので、楽ですね。

コメントを書く

  • こちらは「プチコン3号」「プチコンBIG」など、プチコンシリーズに関する話題を扱ったコミュニティです
  • プチコンシリーズにまったく関係ない書き込みはご遠慮下さい。削除の対象となります
  • こちらにはその他のゲームや雑談のコミュニティはなく、作る予定もありません (ひとりで管理できないため)。ごめんなさい
  • ユーザー登録なしで書き込みができます
  • 秘密の合い言葉は成りすましの防止 (トリップ機能)、書き込みの編集時の本人認証に使用します
  • 秘密の合い言葉に他人に推測されやすい言葉、他サービスと同じパスワードは入力しないでください。
  • 書き込むと、投稿時に入力したお名前と秘密の暗号が記憶され、ログイン状態になります

- WEB PATIO -