1-1.q1q2=
○○○○○(w1w2-x1x2-y1y2-z1z2)
○○○○+(w1x2+x1w2+y1z2-z1y2)i
○○○○+(w1y2-x1z2+y1w2+z1x2)j
○○○○+(w1z2+x1y2-y1x2+z1w2)k
qPq^-1=(s+v)P(s-v)
○○○=(-v・P+sP+v×P)(s-v)
○○○=-sv・P+s^2P+s(v×P)+(v・P)v-sPv-(v×P)v
○○○=s^2P+2s(v×P)+(v・P)v-(v×P×v)
○○○○|1-2y^2-2z^2○2xy-2wz○2xz+2wy|
P.rot(q)=|2yx+2wz○1-2x^2-2z^2○2yz-2wx||P|
○○○○|2zx-2wy○2zy+2wx○1-2x^2-2y^2|
・./javascripts/nas6/testpoly.js
// ……… 前 略 ………
var bp = new N6LVector([1, 0, 0, 8, 1, 0, 0, 0], true); //pos Box//Box座標
//main loop//メインループ
function GLoop(id){
// ……… 中 略 ………
//姿勢ベクトル演算
var VecWK = new N6LVector([1,0,0,0,1,0,0,0],true);
var v = new N6LVector(4, false);
//unit vector//単位ベクトル
var ax = new N6LVector(4, true).UnitVec(1);
var ay = new N6LVector(4, true).UnitVec(2);
var az = new N6LVector(4, true).UnitVec(3);
//rot mov obj//物体回転移動
var q = new N6LQuaternion().UnitQuat().RotAxisQuat(ay, 1.0 * Math.PI / 180.0);
var pv = new N6LVector([1,0,0,0,q.q.x[0],q.q.x[1],q.q.x[2],q.q.x[3]], true)
var pvb = new N6LVector([bp.x[0],bp.x[1],bp.x[2],bp.x[3],1,0,0,0], true);
VecWK = pv.PosVecMul(pvb); //around y axis rotate 1 degree//y軸回りに1度回転する回転行列を乗算
//unit vector//単位ベクトル
ax = ax.UnitVec(1);
ay = ay.UnitVec(2);
az = az.UnitVec(3);
//rot obj//物体回転
q = new N6LQuaternion().UnitQuat().RotAxisQuat(az, 3.0 * Math.PI / 180.0);
pv = new N6LVector([1,0,0,0,q.q.x[0],q.q.x[1],q.q.x[2],q.q.x[3]], true)
pvb = new N6LVector([VecWK.x[0],VecWK.x[1],VecWK.x[2],VecWK.x[3],bp.x[4],bp.x[5],bp.x[6],bp.x[7]], true);
VecWK = pvb.PosVecMul(pv); //around z axis rotate 3 degree//z軸回りに3度回転する回転行列を乗算
q = new N6LQuaternion().UnitQuat().RotAxisQuat(ay, 2.0 * Math.PI / 180.0);
pv = new N6LVector([1,0,0,0,q.q.x[0],q.q.x[1],q.q.x[2],q.q.x[3]], true)
VecWK = VecWK.PosVecMul(pv); //around z axis rotate 3 degree//z軸回りに3度回転する回転行列を乗算
q = new N6LQuaternion().UnitQuat().RotAxisQuat(ax, 1.0 * Math.PI / 180.0);
pv = new N6LVector([1,0,0,0,q.q.x[0],q.q.x[1],q.q.x[2],q.q.x[3]], true)
bp = VecWK.PosVecMul(pv); //around z axis rotate 3 degree//z軸回りに3度回転する回転行列を乗算
var tbm = bp.PosVecMatrix();
var tbx = tbm.Pos();
var v = tbm.Vector(); //rot vector//回転行列から回転ベクトルを取得
var angle = tbm.EulerAngle(3, 2, 1); //rotate order ZYX //回転順番 ZYX
// ↑ 前 半 : ↓ 後 半
//apply x3dom
var pos = tbx.ToX3DOM(true);
var elm = document.getElementById('box0');
elm.setAttribute('translation', pos.toString());
var rot = v.ToX3DOM();
elm = document.getElementById('box1');
elm.setAttribute('rotation', rot.toString());
//debug//デバッグ用
elm = document.getElementById('debug');
elm.innerText =
'EulerAngle(rotate per degree z(3)_y(2)_x(1))\n' + angle.x[0] + ' ' + Math.floor(angle.x[1] * 180.0 / Math.PI) + ' ' + Math.floor(angle.x[2] * 180.0 / Math.PI) + ' ' + Math.floor(angle.x[3] * 180.0 / Math.PI);
TMan.timer[id].setalerm(function() { GLoop(id); }, 50); //reset main loop//メインループ再セット
}
// ……… 後 略 ………






