. , CSS . , , , .
, , , , , , . , . , JavaScript.
, CSS. , transform, ,
transform: "rotateX(90deg) rotateY(90deg)"
. , .. , , 90 , .
@ihazkode, rotate3d - . , X, Y Z. rotate3d 3
rotate3d(x, y, z, angle).
x y z . : , (x,y,z) transform-origin, . . , (x,y,z). angle .
. rotate3d , , ( ), , , . , , , .
, matrix3d. , mousemove.
, , mousedown, mousemove. , (123,145) , (120,143) mousemove, [x, y, z, m],
x - x-, x x position = 120 - 123 = -3
y - y-, x, = 143-145 = -2
z = 0, z
m - , squareroot (x 2 + y 2) = 3.606
, [-3, -2, 0, 3.606]
, . , 3 , [0, -1,0,3] (y , - ). rotate3d, ( ) y. ! , x! , x y x. [1,0,0,3]. , 1 [2, -3,0,3,606].
transform
transform: "rotate3d(2,-3,0,3.606)"
, , , rotateX, rotateY.
- . , , . , , ,
rotate3d, . , reset . . , , , .
, . -
transform: "rotate3d(previous_rotation_vector) rotate3d(new_rotation_vector)"
, , . 100 . transform 100 rotate3d s. .
. , transform css node,
$('.cube').css('transform');
: "none", , 2D- ( matrix2d(...)), 2D-, ( matrix3d(...) .
, , . , , :
transform: "matrix3d(saved_matrix_from_last_rotation) rotate3d(new_rotation_vector)"
, . 100 rotate3d s.
- , . , .
, 90
transform: rotate3d(1,0,0,90deg);
y 45
transform: matrix3d(saved values) rotate3d(0,1,0,45deg)
, 90, 45. 90, 45 . , . , rotate3d , x, y z . , .
, , , (x, y, z), , 1 2, - , , .
, 4x1,
x
y
z
angle
matrix3d 4x4, , 3D- , , . 3d-, 3, , .
JavaScript
, . , . , .
var lastX;
var lastY;
var matrix3d = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]
$(document).ready(function() {
$('body').on('mousedown', function(event) {
$('body').on('mouseup', function() {
$('body').off('mousemove');
m = $('.cube').css('transform');
if(m.match(/matrix3d/) == null)
matrix3d = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]];
else
matrix3d = stringToMatrix(m.substring(8,m.length));
});
lastX=event.pageX;
lastY=event.pageY;
$('body').on('mousemove', function (event) {
var x = -(event.pageY - lastY);
var y = event.pageX - lastX;
var angle = Math.sqrt(x*x + y*y);
var r = [[x],[y],[0],[angle]];
rotate3d = multiply(matrix3d, r);
var str = 'matrix3d' + matrixToString(matrix3d)
+ ' rotate3d(' + rotate3d[0][0] + ', ' + rotate3d[1][0] + ', ' + rotate3d[2][0] + ', ' + rotate3d[3][0] + 'deg)';
$('.cube').css('transform',str);
});
});
});
function matrixToString(matrix) {
var s = "(";
for(i=0; i<matrix.length; i++) {
for(j=0; j<matrix[i].length; j++) {
s+=matrix[i][j];
if(i<matrix.length-1 || j<matrix[i].length-1) s+=", ";
}
}
return s+")";
}
function stringToMatrix(s) {
array=s.substring(1,s.length-1).split(", ");
return [array.slice(0,4), array.slice(4,8), array.slice(8,12), array.slice(12,16)];
}
function multiply(a, b) {
var aNumRows = a.length, aNumCols = a[0].length,
bNumRows = b.length, bNumCols = b[0].length,
m = new Array(aNumRows);
for (var r = 0; r < aNumRows; ++r) {
m[r] = new Array(bNumCols);
for (var c = 0; c < bNumCols; ++c) {
m[r][c] = 0;
for (var i = 0; i < aNumCols; ++i) {
m[r][c] += a[r][i] * b[i][c];
}
}
}
return m;
}