数学の話

 数学の話など、ド素人が恐れ多いとは思っていますが、3Dを扱うには逃げるわけにもいかず、わからんなりにも少しづつ理解していきたいと思います。基本的に説明が正しいかどうかわからんのですが、HSPでプログラムを組む人で、同じように苦しむ人にとって、必要な部分だけを理解できればということでやりたいと思います。

クオータニオン

クオータニオン、、、なんじゃそりゃ。。。

四元数だそうです。HotSoupProcessorの、HGIMG4プラグインを使用した場合、getquat命令で、オブジェクトの「姿勢」が得られます。

この際、x,y,z,wという4つの数値が得られるので、四元数とされています。

で、これ一体どうするの?ってのが大事ですよね。

 難しい理屈はわかんなくても仕方がない。


 クオータニオンは、回転に関する情報をもった4つの数値である。これを変化させるには、別のクオータニオンを乗算することで実現する。

 右に(Y軸でもなんでも)40度向いているオブジェクトを左に10度回転させるには、クオータニオンを2つ乗算するということになります。

 強引に、右に40度回転したオブジェクトAをgetquatして、左に50度回転したオブジェクトBをgetquatすることで、2つのクオータニオンが取得できますね。この二つを乗算すると、左に10度回転した新しいクオータニオンが出来上がります。

 いやいや、クオータニオンの乗算て、どうすんの?はい、もう丸投げしましょう。クオータニオンの乗算関数を作ります。 

;=======================================================================

;クオータニオンの乗算   QuatMul   配列4 _q   ,  x  , y , z , w , x2 , y2 ,z2 ,w2

;=======================================================================

#deffunc QuatMul array _q,double x,double y,double z,double w,double x2,double y2,double z2,double w2


 q1(0)=x:q1(1)=y:q1(2)=z:q1(3)=w

 q2(0)=x2:q2(1)=y2:q2(2)=z2:q2(3)=w2

 _q(0)=0.0f:_q(1)=0.0f:_q(2)=0.0f:_q(3)=0.0f


    _q(3)= q1(3) * q2(3) - q1(0) * q2(0) - q1(1) * q2(1) - q1(2) * q2(2) 

    _q(0)= q1(1) * q2(2) - q1(2) * q2(1) + q1(3) * q2(0) + q1(0) * q2(3)

    _q(1)= q1(2) * q2(0) - q1(0) * q2(2) + q1(3) * q2(1) + q1(1) * q2(3)

    _q(2)= q1(0) * q2(1) - q1(1) * q2(0) + q1(3) * q2(2) + q1(2) * q2(3)

    return 

とりあえず、クオータニオンの乗算ができます。(足し算と掛け算しかやっていない!!)

行列の計算ですので、動けばまぁいいじゃないですか。どうせユーザーにはわかんないですし。

基本的にこの関数をいろんなところで使うことになり、親子関係などもこれを応用していくことで実現します。

 なんで、こんなことしなくちゃダメなのか、ていうのは「ジンバルロック」とかでググってください。

今、自分が向いている方向に対して前進したいとか、左右に平行移動したいとか、なめらかにある向きに回転したいとか、色々と便利なことができます。

自由に、思ったように3次元空間を飛び回りたいじゃないですか。そのための下ごしらえということで。

クオータニオンの初期値

  x,y,z,w=(0,0,0,1)   クオータニオンが回転していない状態。クオータニオンは、どのような角度であってもxyzwを合計すると1又は-1になるという摩訶不思議な数値


丸いボールの表面にある1点を指し示すことができる、長さ1の数値セットなんですね。どんなに回転しても、丸いボールの直径は変わりませんから、常に合計1になる、、、のかな。よくわからん。-1は、なんだ?逆回転ってことだろうけど、詳しくは数学本読んでください。

  

このような、3次元のクオータニオンを扱う関数は、HGIMG4では基本的に用意されていないので、自前で作る必要があります。

ベクトルの計算や内積、外積の関数はあるので、クオータニオンや行列の計算は、標準でサポートしてくれるとありがたいです。皆さんがもっと要望を出していく必要があると思いますが、そもそも利用者が少ないと意味もないので、頑張って理解していきたいですね。

回転行列の中身(勉強中)

右手系座標と左手系座標

HSP(GamePlay3D)は右手系!でY軸が上(Y_up)

参考サイトhttps://note.com/ninagawa123/n/ne24fcf08c36f


HSPは、右手座標系であり、Y軸が上方(Y_up)ということです。

中指がZ軸なんですね。

Unityは左手系でY_up Unrealは左手系でZ_up

Blenderは右手系でZ_up

 ほんとめちゃくちゃです。。参考サイトの解説はとても参考になりました。