任意軸で回転する行列生成
第01引数に回転軸を表す3Dベクトル
第02引数に角度
戻り値に行列が返ります。
任意軸で回転する行列を作成
|
function Mtx44Rotate(vec,rot){
var rad = rot * Math.PI / 180;
var c = Math.cos(rad);
var s = Math.sin(rad);
var t = 1.0 - Math.cos(rad);
var x = 0;
var y = 0;
var z = 0;
var length = Math.sqrt((vec.x * vec.x) + (vec.y * vec.y) + (vec.z * vec.z));
if(length != 0.0){
x = vec.x / length;
y = vec.y / length;
z = vec.z / length;
}
return {
_00 : t * x * x + c,
_01 : t * y * x + s * z,
_02 : t * z * x - s * y,
_10 : t * x * y - s * z,
_11 : t * y * y + c,
_12 : t * z * y + s * x,
_20 : t * x * z + s * y,
_21 : t * y * z - s * x,
_22 : t * z * z + c,
_30 : 0.0,
_31 : 0.0,
_32 : 0.0
};
}
|
例)任意軸(1,1,1)で30度回転する行列
|
var vec = {x:1,y:1,z:1};
var matrix = Mtx44Rotate(vec,30);
|
回転行列 × 行列
回転行列を生成してから、別の行列の前に置いて乗算する関数です。
第01引数に回転軸を表す3Dベクトル
第02引数に角度
第03引数に行列
戻り値に行列が返ります。
回転行列を別の行列の前に置いて乗算
|
function Mtx44RotatePref(vec,rot,m){
var rad = rot * Math.PI / 180;
var c = Math.cos(rad);
var s = Math.sin(rad);
var t = 1.0 - Math.cos(rad);
var x = 0;
var y = 0;
var z = 0;
var length = Math.sqrt((vec.x * vec.x) + (vec.y * vec.y) + (vec.z * vec.z));
if(length != 0.0){
x = vec.x / length;
y = vec.y / length;
z = vec.z / length;
}
var _00 = t * x * x + c;
var _01 = t * y * x + s * z;
var _02 = t * z * x - s * y;
var _10 = t * x * y - s * z;
var _11 = t * y * y + c;
var _12 = t * z * y + s * x;
var _20 = t * x * z + s * y;
var _21 = t * y * z - s * x;
var _22 = t * z * z + c;
return {
_00 : _00 * m._00 + _01 * m._10 + _02 * m._20,
_01 : _00 * m._01 + _01 * m._11 + _02 * m._21,
_02 : _00 * m._02 + _01 * m._12 + _02 * m._22,
_10 : _10 * m._00 + _11 * m._10 + _12 * m._20,
_11 : _10 * m._01 + _11 * m._11 + _12 * m._21,
_12 : _10 * m._02 + _11 * m._12 + _12 * m._22,
_20 : _20 * m._00 + _21 * m._10 + _22 * m._20,
_21 : _20 * m._01 + _21 * m._11 + _22 * m._21,
_22 : _20 * m._02 + _21 * m._12 + _22 * m._22,
_30 : m._30,
_31 : m._31,
_32 : m._32
};
}
|
例)[任意軸(1,1,1)で30度回転する行列] × [(1,2,3)移動する行列]
|
var v1 = {x:1,y:2,z:3};
var m1 = Mtx44Translate(v1);
var v2 = {x:1,y:1,z:1};
var m2 = Mtx44RotatePref(v2,30 ,m1);
|
行列 × 回転行列
回転行列を生成してから、別の行列の後に置いて乗算する関数です。
第01引数に回転軸を表す3Dベクトル
第02引数に角度
第03引数に行列
戻り値に行列が返ります。
回転行列を別の行列の後に置いて乗算
|
function Mtx44RotatePost(vec,rot,m){
var rad = rot * Math.PI / 180;
var c = Math.cos(rad);
var s = Math.sin(rad);
var t = 1.0 - Math.cos(rad);
var x = 0;
var y = 0;
var z = 0;
var length = Math.sqrt((vec.x * vec.x) + (vec.y * vec.y) + (vec.z * vec.z));
if(length != 0.0){
x = vec.x / length;
y = vec.y / length;
z = vec.z / length;
}
var _00 = t * x * x + c;
var _01 = t * y * x + s * z;
var _02 = t * z * x - s * y;
var _10 = t * x * y - s * z;
var _11 = t * y * y + c;
var _12 = t * z * y + s * x;
var _20 = t * x * z + s * y;
var _21 = t * y * z - s * x;
var _22 = t * z * z + c;
return {
_00 : m._00 * _00 + m._01 * _10 + m._02 * _20,
_01 : m._00 * _01 + m._01 * _11 + m._02 * _21,
_02 : m._00 * _02 + m._01 * _12 + m._02 * _22,
_10 : m._10 * _00 + m._11 * _10 + m._12 * _20,
_11 : m._10 * _01 + m._11 * _11 + m._12 * _21,
_12 : m._10 * _02 + m._11 * _12 + m._12 * _22,
_20 : m._20 * _00 + m._21 * _10 + m._22 * _20,
_21 : m._20 * _01 + m._21 * _11 + m._22 * _21,
_22 : m._20 * _02 + m._21 * _12 + m._22 * _22,
_30 : m._30 * _00 + m._31 * _10 + m._32 * _20,
_31 : m._30 * _01 + m._31 * _11 + m._32 * _21,
_32 : m._30 * _02 + m._31 * _12 + m._32 * _22
};
}
|
例)[(1,2,3)移動する行列] × [任意軸(1,1,1)で30度回転する行列]
|
var v1 = {x:1,y:2,z:3};
var m1 = Mtx44Translate(v1);
var v2 = {x:1,y:1,z:1};
var m2 = Mtx44RotatePost(v2 ,30 ,m1);
|
|