The problem for the turnover is that the axis is attached to the geometry.
Now: http://f2.s.qip.ru/cMfvUhEy.png
Now (rotate): http://f3.s.qip.ru/cMfvUhEC.png
Necessary (rotate): http://f1.s.qip.ru/cMfvUhEG.png
The problem for the turnover is that the axis is attached to the geometry.
Now: http://f2.s.qip.ru/cMfvUhEy.png
Now (rotate): http://f3.s.qip.ru/cMfvUhEC.png
Necessary (rotate): http://f1.s.qip.ru/cMfvUhEG.png
mesh.rotation.x = Math.PI / 180 * 90;
sets the rotation, it does not increment it.
In three.js, an object's orientation can be specified by its Euler rotation vector object.rotation
. The three components of the rotation vector represent the rotation in radians around the object's internal x-axis, y-axis, and z-axis respectively.
The order in which the rotations are performed is specified by object.rotation.order
. The default order is 'XYZ' -- rotation around the x-axis occurs first, then the y-axis, then the z-axis.
Rotations are performed with respect to the object's internal coordinate system -- not the world coordinate system. This is important. So, for example, after the x-rotation occurs, the object's y- and z- axes will generally no longer be aligned with the world axes. Rotations specified in this way are not unique.
For more information about Euler angles, see the Wikipedia article. Three.js follows the Tait–Bryan convention, as explained in the article.
EDIT: If you want to "reset" the rotation, see this answer.
three.js r.73
If you want to rotate or otherwise transform an object, but then treat it as non-transformed for the purposes of further transformation, one approach is to add it to a new Object3D instance and apply the additional transforms to that:
var line = new THREE.Geometry();
line.vertices.push(
new THREE.Vector3( 0, 0, 0 ),
new THREE.Vector3( 0, 10, 0 ),
);
line.rotation.z = 30 * Math.PI / 180;
var lineObject = new THREE.Object3D();
lineObject.Add(line);
// lineObject.rotation.z == 0 and its rotation axes align with the world
// you can perform any further rotations on lineObject
You can learn more about this transform-stacking approach from this video from the Udacity ThreeJS course:
https://www.youtube.com/watch?v=RBemS5NCVyw
The lecturer discusses how to rotate a clock's hand after it has been rotated, compared to ThreeJS' native rotate-then-translate behavior (so he's stacking a translation on a rotation, while you're performing two independent rotations, but the idea is the same).