问题
Having an element with the following transformation:
style="transform: rotate3d(1, 0, 0, -50deg);"
I want to be able to get the value -50
with Javascript/jQuery.
I want to get the absolute value, so if it is 370deg, i do not want to get 10, but 370.
Using $('#element').css('transform')
returns a matrix like this:
matrix3d(1, 0, 0, 0, 0, 0.642788, -0.766044, 0, 0, 0.766044, 0.642788, 0, 0, 0, 0, 1)
Which can be better represented as:
matrix3d(
1, 0, 0, 0,
0, 0.642788, -0.766044, 0,
0, 0.766044, 0.642788, 0,
0, 0, 0, 1
)
Is solving the equations the only way to get this value?
Knowing that Z =0 and X =1 as rotate3d(1, 0, 0, -50deg);
Isn't there any faster alternative to this?
回答1:
While it still requires calculations ran on the matrix values, the simplest example I could find is as follows:
var el = document.getElementById('test');
var st = window.getComputedStyle(el, null);
var m = st.getPropertyValue('transform');
var values = m.slice(7,-1).split(',');
// angle is in range -180 > 180
var angle = Math.round(Math.atan2(values[1], values[0]) * (180/Math.PI));
Fiddle here. More info here.
Note: The example given was tested on a matrix
rather than matrix3d
. However from MDN:
matrix(a, b, c, d, tx, ty) is a shorthand for matrix3d(a, b, 0, 0, c, d, 0, 0, 0, 0, 1, 0, tx, ty, 0, 1)
So you can apply the exact same method to solve in either case, you will just need to update the method for pulling out the values.
回答2:
The most simple solution I could come up with ...
var el = $('.el');
var matrix = el.css('transform');
var values = matrix.split('(')[1].match(/-?[\d\.]+/g);
var rad = Math.atan2(values[6], values[5]);
if ( rad < 0 ) rad += (2 * Math.PI);
var angle = rad * (180/Math.PI);
el.text(Math.round(angle));
.el {
width: 50px; height: 50px;
background: tomato;
transform: rotate3d(1, 0, 0, 60deg);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="el"></div>
If you want to use libraries, you can use one of this:
http://github.com/Luxiyalu/jquery-transformer
http://paperjs.org/reference/matrix/
回答3:
I should have payed a bit more attention to it. After a while I realized this can not be solved mathematically. Not if I want to get the exact absolute degrees and not the relative ones.
The matrix we get with a transformation of 370 degrees is exactly the same one we get with a transformation of 10 degrees. Therefore it is impossible to get two different resulting values for alpha with the exact same input.
with transform: rotate3d(1, 0, 0, 10deg);
we get:
matrix3d(1, 0, 0, 0, 0, 0.984808, 0.173648, 0, 0, -0.173648, 0.984808, 0, 0, 0, 0, 1)
And with transform: rotate3d(1, 0, 0, 370deg);
the exact same one:
matrix3d(1, 0, 0, 0, 0, 0.984808, 0.173648, 0, 0, -0.173648, 0.984808, 0, 0, 0, 0, 1)
Reproduction online
来源:https://stackoverflow.com/questions/39852138/getting-rotate3d-values-with-javascript-jquery