vex: quaternion function - miyagiA/MyLearningNote GitHub Wiki

quaternion()


//quaternion()----------------------------------------------
vector4  quaternion(matrix3 rotations)
//3×3の回転行列からvector4のクォータニオンを作成します。
vector4  quaternion(float angle, vector axis)
//angleとaxisからvector4のクォータニオンを作成します。angleの単位はラジアンです。
vector4  quaternion(vector angleaxis)
//角度/軸の組み合わせからクォータニオンを表現したvector4を作成します。
//ここには、正規化した回転軸と回転角度(ラジアン)を乗算した値を指定します。

//以前は、回転ベクトルを受け取る4番目のバージョンの関数がありましたが、
//eulertoquaternionに名前が変わり、今ではラジアンを受け取ります。
//----------------------------------------------------------

vector4 quaternion(matrix3 rotations)

//まだためしてない
//quaternion()----------------------------------------------
//●vector4  quaternion(matrix3 rotations)
//----------------------------------------------------------

vector4 quaternion(float angle, vector axis)

  • 単体の軸で動かす場合に適している。
  • 何度も処理を重ねて複数の軸毎に回転させるならこの書き方は冗長だがわかりやすい。
  • 軸をコントロールできることはメリットでもある。ローカル軸で回転させる場合などは使えるかも?
//This means the same value as "transform" node "rotation".
v@rot=chv("rot");
v@rotR=radians(v@rot);

vector axX=set(1,0,0);
vector axY=set(0,1,0);
vector axZ={0,0,1};

//vector4  quaternion(float angle, vector axis)
vector4 quat =quaternion(radians([email protected]),axX);
v@P=qrotate(quat,@P);
quat =quaternion(radians([email protected]),axY);
v@P=qrotate(quat,@P);
quat =quaternion(radians([email protected]),axZ);
v@P=qrotate(quat,@P);

vector4 quaternion(vector angleaxis)

  • どういうルールで動いているのか、理解できなかった・・・
  • 引数を一つのベクトルしかとらないので、Lookatのような動きかと思ったがそうでもない。
//This means the same value as "transform" node "rotation".
v@rot=chv("rot");
v@rotR=radians(v@rot);

//vector4  quaternion(vector angleaxis)
//★ I can not understand....2022.12.04
vector4 quat =quaternion(v@rotR);
v@P=qrotate(quat,@P);

eulertoquaternion()

vector4 eulertoquaternion(vector rotations, int order)

  • ワールド空間のXYZどの順番で回転するのか?と考えると比較的理解しやすい。
  • order は書式が決まっていて普通は、XFORM_XYZ のような書き方で良さそう。
//----------------------------------------------------------
vector4  eulertoquaternion(vector rotations, int order)

//X,Y,Zのオイラー回転を表現したベクトルからクォータニオンを表現したvector4を作成します。
//角度の単位はラジアンです。度をラジアンに変換するには、radians()関数を使用します。
//order整数値で回転順を指定します。$HH/vex/include/math.hで定義された定数(例えば、XFORM_XYZはx,y,zの順番で回転を行ないます)を使用してください。
//----------------------------------------------------------
//This means the same value as "transform" node "rotation".
v@rot=chv("rot");
v@rotR=radians(v@rot);

//Get a quaternion with two inputs.
//The input is the rotation value in radians and the calculation order of the axes
//vector4  eulertoquaternion(vector rotations, int order)
vector4 quat = eulertoquaternion(v@rotR,XFORM_XYZ);

//Returns the vector 2rdInput rotated by the given quaternion .
v@P=qrotate(quat,@P);