数学の話
数学の話など、ド素人が恐れ多いとは思っていますが、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
ほんとめちゃくちゃです。。参考サイトの解説はとても参考になりました。