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//メインループ再セット } // ……… 後 略 ………