2012-06-20 20 views
10

オブジェクトではなく世界の軸をとって回転を行うことは可能ですか?axis world three.jsでオブジェクトを回転するにはどうすればいいですか?

私はオブジェクトの回転を行う必要がありますが、最初の回転後は、私が望むように他の回転を行うことはできません。

世界の軸で回転することができない場合、私の2番目の選択肢は、最初の回転後に軸をリセットすることです。これにはいくつかの機能がありますか?

一部の回転後にobject.eulerOrder="YZX"を設定すると、オブジェクトの向きが変わるため、object.eulerOrderは使用できません。

+0

@RamyAlZuhouriこれらの新しい方法を試してみてください。http://stackoverflow.com/a/17712076 – user2301179

答えて

12

はいあなたはthree.js githubの問題に供給された機能でそれを行うことができます。そして、

var rotWorldMatrix; 

// Rotate an object around an arbitrary axis in world space  
function rotateAroundWorldAxis(object, axis, radians) { 
    rotWorldMatrix = new THREE.Matrix4(); 
    rotWorldMatrix.makeRotationAxis(axis.normalize(), radians); 
    rotWorldMatrix.multiplySelf(object.matrix);  // pre-multiply 
    object.matrix = rotWorldMatrix; 
    object.rotation.getRotationFromMatrix(object.matrix, object.scale); 
} 

//rotate 30 degrees on world X 
rotateAroundWorldAxis(cube, new THREE.Vector3(1,0,0), 30 * Math.PI/180); 

私の例を参照してください - http://jsfiddle.net/SCXNQ/156/

+0

getRotationFromMatrixは関数として認識されない、またmultiplySelfを。特定のthree.jsバージョンを使用する必要がありますか? –

+1

@RamyAlZuhouriは、3つのギブスを見て、彼らは今に機能を変更してください参照してください。最新のThree.js – Neil

+8

'getRotationFromMatrix(object.matrix、object.scale)' - > 'setFromRotationMatrix(object.matrix)'と 'multiplySelf' - >' multiply'を使いたいと思います。 r71 – PierreDuc

2

はここに小さな変化です。 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); 
} 

3つの最後の行は、私はそれを行うには、より効率的な方法があるかどうだろう...ちょうどマトリックスからのparams (position,rotation)を再同期するためにある...

1

どこかが、これは多くのことを得るの周りR59 (Xの周りを回転)が容易:

bb.GraphicsEngine.prototype.calcRotation = function (obj, rotationX) 
{ 
    var euler = new THREE.Euler(rotationX, 0, 0, 'XYZ'); 
    obj.position.applyEuler(euler); 
} 
関連する問題