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

后端 未结 5 1376
深忆病人
深忆病人 2020-12-03 05:35

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 ot

相关标签:
5条回答
  • 2020-12-03 05:47

    Updated answer from @Neil (tested on r98)

    function rotateAroundWorldAxis(obj, axis, radians) {
       let rotWorldMatrix = new THREE.Matrix4();
       rotWorldMatrix.makeRotationAxis(axis.normalize(), radians);
       rotWorldMatrix.multiply(obj.matrix);
       obj.matrix = rotWorldMatrix;
       obj.setRotationFromMatrix(obj.matrix);
    }
    
    0 讨论(0)
  • 2020-12-03 05:52

    THREE - r107

    // select the Z world axis
    this.myAxis = new Vector3(0, 0, 1);
    
    // rotate the mesh 45 on this axis
    this.mesh.rotateOnWorldAxis(this.myAxis, Math.degToRad(45));
    
    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;
    }
    
    0 讨论(0)
  • 2020-12-03 05:56

    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);
    }
    
    0 讨论(0)
  • 2020-12-03 05:57

    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
    THREE.Object3D.prototype.rotateAroundWorldAxis = function(axis, radians) { 
        THREE.Object3D._matrixAux.makeRotationAxis(axis, radians);
        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 );
    }
    THREE.Object3D.prototype.rotateAroundWorldAxisX = function(radians) { 
        this._vector.set(1,0,0);
        this.rotateAroundWorldAxis(this._vector,radians);
    }
    THREE.Object3D.prototype.rotateAroundWorldAxisY = function(radians) { 
        this._vector.set(0,1,0);
        this.rotateAroundWorldAxis(this._vector,radians);
    }
    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...

    0 讨论(0)
  • 2020-12-03 05:58

    @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.

    0 讨论(0)
提交回复
热议问题