X-Git-Url: http://git.osdn.net/view?p=mikutoga%2FTogaGem.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fjp%2Fsfjp%2Fmikutoga%2Fmath%2FMkQuat.java;fp=src%2Fmain%2Fjava%2Fjp%2Fsfjp%2Fmikutoga%2Fmath%2FMkQuat.java;h=c8150272fe84ef09f6994eeba5631e1611c36e38;hp=d00b17589fd8a243ae0704806f795ce8cbb50f57;hb=ca790c392b3e12ba485b897aa10334aff7fce4b1;hpb=3747423c564042a26a0d1db6cc1fc79965c5140c diff --git a/src/main/java/jp/sfjp/mikutoga/math/MkQuat.java b/src/main/java/jp/sfjp/mikutoga/math/MkQuat.java index d00b175..c815027 100644 --- a/src/main/java/jp/sfjp/mikutoga/math/MkQuat.java +++ b/src/main/java/jp/sfjp/mikutoga/math/MkQuat.java @@ -9,6 +9,7 @@ package jp.sfjp.mikutoga.math; /** * クォータニオンによる回転表現。 + * *

虚部q1,q2,q3と実部qwから構成される。 */ public strictfp class MkQuat { @@ -37,6 +38,7 @@ public strictfp class MkQuat { /** * コンストラクタ。 + * *

虚部が全て0.0、実部が1.0となる。 */ public MkQuat(){ @@ -46,6 +48,7 @@ public strictfp class MkQuat { /** * コンストラクタ。 + * * @param q コピー元クォータニオン */ public MkQuat(MkQuat q){ @@ -55,6 +58,7 @@ public strictfp class MkQuat { /** * コンストラクタ。 + * * @param q1 虚部1 * @param q2 虚部2 * @param q3 虚部3 @@ -72,8 +76,11 @@ public strictfp class MkQuat { /** * クォータニオン積を求め格納する。 + * *

クォータニオン積では交換則が成り立たない。 + * *

引数は同一インスタンスを含んでもよい。 + * * @param qA 積前項 * @param qB 積後項 * @param result 積の格納先 @@ -111,7 +118,9 @@ public strictfp class MkQuat { /** * 共役(共軛)クォータニオンを求め格納する。 + * *

引数は同一インスタンスでもよい。 + * * @param q クォータニオン * @param result 格納先 */ @@ -125,7 +134,9 @@ public strictfp class MkQuat { /** * 単位クォータニオンを求め格納する。 + * *

引数は同一インスタンスでもよい。 + * * @param q クォータニオン * @param result 格納先 */ @@ -147,9 +158,12 @@ public strictfp class MkQuat { /** * 逆元クォータニオンを求め格納する。 + * *

対象クォータニオンの絶対値が小さい場合、 * 無限大が虚部実部に入る可能性がある。 + * *

引数は同一インスタンスでもよい。 + * * @param q クォータニオン * @param result 格納先 */ @@ -274,8 +288,11 @@ public strictfp class MkQuat { /** * 位置情報を読み込む。 + * *

虚部q1,q2,q3にX,Y,Z軸の変量が入る。 + * *

実部には0が入る。 + * * @param xPos X位置 * @param yPos Y位置 * @param zPos Z位置 @@ -290,8 +307,11 @@ public strictfp class MkQuat { /** * 位置情報を読み込む。 + * *

虚部q1,q2,q3にX,Y,Z軸の変量が入る。 + * *

実部には0が入る。 + * * @param pos 位置情報 */ public void setPos3D(MkPos3D pos){ @@ -301,8 +321,10 @@ public strictfp class MkQuat { /** * YXZオイラー角を読み込む。 + * *

Y軸回転、X軸回転、Z軸回転の順に * 個別回転クォータニオンの積をとったものと等しい。 + * * @param xRot X軸回転量(ラジアン)。第2軸 * @param yRot Y軸回転量(ラジアン)。第1軸 * @param zRot Z軸回転量(ラジアン)。第3軸 @@ -330,8 +352,10 @@ public strictfp class MkQuat { /** * YXZオイラー角を読み込む。 + * *

Y軸回転、X軸回転、Z軸回転の順に * 個別回転クォータニオンの積をとったものと等しい。 + * * @param rot YXZオイラー角 */ public void setEulerYXZ(EulerYXZ rot){ @@ -341,10 +365,12 @@ public strictfp class MkQuat { /** * クォータニオンをYXZオイラー角へと変換する。 + * *

ジンバルロック時のYZ配分が指定可能。 + * * @param result YXZオイラー角 * @param oldY ジンバルロック時(オイラー角Xが直角etc.) - * に使われるY軸回転量 + * に使われるY軸回転量 */ public void toEulerYXZ(EulerYXZ result, double oldY){ double qx = this.q1; @@ -372,8 +398,8 @@ public strictfp class MkQuat { double m11 = 1.0 - 2.0 * (qx2 + qz2); double m12 = 2.0 * (qyz - qwx); -// double m20 = 2.0 * (qxz - qwy); -// double m21 = 2.0 * (qwx + qyz); + // double m20 = 2.0 * (qxz - qwy); + // double m21 = 2.0 * (qwx + qyz); double m22 = 1.0 - 2.0 * (qx2 + qy2); double resultX; @@ -461,14 +487,14 @@ public strictfp class MkQuat { double rprrQ1; double rprrQ2; double rprrQ3; -// double rprrQW; rprrQ1 = rpQ2 * rrQ3 - rpQ3 * rrQ2 + rpQW * rrQ1 + rpQ1 * rrQW; rprrQ2 = rpQ3 * rrQ1 - rpQ1 * rrQ3 + rpQW * rrQ2 + rpQ2 * rrQW; rprrQ3 = rpQ1 * rrQ2 - rpQ2 * rrQ1 + rpQW * rrQ3 + rpQ3 * rrQW; -// rprrQW = rpQW * rrQW - rpQ1 * rrQ1 - rpQ2 * rrQ2 - rpQ3 * rrQ3; -// assert rprrQW == 0.0; + // double rprrQW; + // rprrQW = rpQW * rrQW - rpQ1 * rrQ1 - rpQ2 * rrQ2 - rpQ3 * rrQ3; + // assert rprrQW == 0.0; result.setXpos(rprrQ1); result.setYpos(rprrQ2);