# How to rotate a object on axis world three.js?

Is it possible to do rotations taking axis of the world and not of the object?

I need to do some rotations of an object, but after the first rotation, I can't do other rotations like i want.

If it's not possible to do rotation on the axis of the world, my second option is to reset the axis after the first rotation. Is there some function for this?

I can't use `object.eulerOrder` because it changes the orientation of my object when I set `object.eulerOrder="YZX"` after some rotations. THREE - r107

``````// select the Z world axis
this.myAxis = new Vector3(0, 0, 1);

// rotate the mesh 45 on this axis

animate() {
// rotate our object on its Y axis,
// but notice the cube has been transformed on world axis, so it will be tilted 45deg.
this.mesh.rotation.y += 0.008;
}
`````` Here's a small variation. Tested with r56.

``````THREE.Object3D._matrixAux = new THREE.Matrix4(); // global auxiliar variable
// Warnings: 1) axis is assumed to be normalized.
//  2) matrix must be updated. If not, call object.updateMatrix() first
//  3) this assumes we are not using quaternions
this.matrix.multiplyMatrices(THREE.Object3D._matrixAux,this.matrix); // r56
THREE.Object3D._matrixAux.extractRotation(this.matrix);
this.rotation.setEulerFromRotationMatrix(THREE.Object3D._matrixAux, this.eulerOrder );
this.position.getPositionFromMatrix( this.matrix );
}
this._vector.set(1,0,0);
}
this._vector.set(0,1,0);
}
THREE.Object3D.prototype. rotateAroundWorldAxisZ = function(degrees){
this._vector.set(0,0,1);
this.rotateAroundWorldAxis(this._vector,degrees);
}
``````

The three last lines are just to resync the params `(position,rotation)` from the matrix... I wonder if there is a more efficient way to do that... Somewhere around r59 this gets a lot easier (rotate around x):

``````bb.GraphicsEngine.prototype.calcRotation = function ( obj, rotationX)
{
var euler = new THREE.Euler( rotationX, 0, 0, 'XYZ' );
obj.position.applyEuler(euler);
}
`````` Updated answer from @Neil (tested on `r98`)

``````function rotateAroundWorldAxis(obj, axis, radians) {
let rotWorldMatrix = new THREE.Matrix4();
rotWorldMatrix.multiply(obj.matrix);
obj.matrix = rotWorldMatrix;
obj.setRotationFromMatrix(obj.matrix);
}
`````` @acarlon Your answer might just have ended a week of frustration. I've refined your function a bit. Here are my variations. I hope this saves someone else the 20+ hours I spent trying to figure this out.

``````function calcRotationAroundAxis( obj3D, axis, angle ){

var euler;

if ( axis === "x" ){
euler = new THREE.Euler( angle, 0, 0, 'XYZ' );
}

if ( axis === "y" ){
euler = new THREE.Euler( 0, angle, 0, 'XYZ' );
}

if ( axis === "z" ){
euler = new THREE.Euler( 0, 0, angle, 'XYZ' );
}
obj3D.position.applyEuler( euler );
}

function calcRotationIn3D( obj3D, angles, order = 'XYZ' ){

var euler;

euler = new THREE.Euler( angles.x, angles.y, angles.z, order );

obj3D.position.applyEuler( euler );

}
``````

This works beautifully in r91. Hope it helps.