2012-08-06 131 views
2

我正在使用Three.js,我希望能夠從場景中取出一個對象,然後用一個新對象替換它,但與我移除的對象相同。在Three.js中恢復旋轉

我注意到的對象,我刪除,然後旋轉使用此功能來設置新對象的旋轉:

rotateToWorldAxis = function(object, xradians, yradians, zradians) { 
    axisX = new THREE.Vector3(0, 1, 0); 
    axisY = new THREE.Vector3(1, 0, 0); 
    axisZ = new THREE.Vector3(0, 0, 1); 

    rotationMatrix = new THREE.Matrix4(); 
    rotationMatrix.setRotationAxis(axisX.normalize(), xradians) 
    object.matrix = rotationMatrix; 
    object.rotation.setRotationFromMatrix(object.matrix); 

    rotationMatrix = new THREE.Matrix4(); 
    rotationMatrix.setRotationAxis(axisY.normalize(), yradians); 
    rotationMatrix.multiplySelf(object.matrix); 
    object.matrix = rotationMatrix; 
    object.rotation.setRotationFromMatrix(object.matrix); 

    rotationMatrix = new THREE.Matrix4(); 
    rotationMatrix.setRotationAxis(axisZ.normalize(), zradians); 
    rotationMatrix.multiplySelf(object.matrix); 
    object.matrix = rotationMatrix; 
    object.rotation.setRotationFromMatrix(object.matrix); 
} 

x和y的旋轉工作得很好,但Z軸旋轉不沒有給出預期的結果。

如果有人能夠發現我所做的錯誤或者我應該以另一種方式做出來,我將不勝感激。

感謝

+0

您發佈的代碼在很多級別上都是完全錯誤的。你嘗試過單行:'object.rotation.set(xradians,yradians,zradians)',其中'xradians = oldObject.rotation.x'等等? – WestLangley 2012-08-06 21:15:54

+0

非常感謝您的回覆 - 我採納了您的建議並將其功能更改爲: rotateToWorldAxis = function(object,xradians,yradians,zradians)object.rotation.set(xradians,yradians,zradians); object.matrix.setRotationFromEuler(object.rotation); } 現在它工作得很好 - 再次感謝! – talktoughuk 2012-08-06 22:43:09

+0

你不需要'setRotationFromEuler()'部分。見下面的答案。 – WestLangley 2012-08-07 00:06:00

回答

2

這樣做:

object.rotation.set(xradians, yradians, zradians); 

其中xradians = oldObject.rotation.x等..

而且,除非你已經改變了它,爲object.matrixAutoUpdate的默認值是true,讓你不需要直接設置object.matrix。 - 只需設置旋轉。 render()調用將爲您更新矩陣。

+1

它也可以簡化爲....'oldRotation.copy(oldObject.rotation); object.copy(oldRotation);' – mrdoob 2012-08-07 01:20:44

+2

@mrdoob,你的意思是'object.rotation.copy(oldObject.rotation);'?那更好。我不明白你的第二個表情,雖然... – WestLangley 2012-08-07 01:35:11

+0

啊,是的。這甚至更好。 – mrdoob 2012-08-07 02:07:47