2017-05-31 37 views
2

關於three.js的大多數教程/問題都建議使用three.js圍繞一個點旋轉對象的方法是在要旋轉的位置創建一個父對象,附加對象,然後移動該子對象。然後,當父母旋轉時,孩子圍繞該點旋轉。例如;在three.js的某個點周圍旋轉物體的正確方法是什麼?

//Make a pivot 
var pivot = new THREE.Object3D(); 
//Make an object 
var object = new THREE.Mesh(new THREE.BoxGeometry(2,2,2), new THREE.MeshBasicMaterial()); 
//Add object to pivot 
pivot.add(object); 

//Move object away from pivot 
object.position.set(new THREE.Vector3(5,0,0)); 

//rotate the object 90 degrees around pivot 
pivot.rotation.y = Math.PI/2; 

這工作,但它是令人難以置信的限制 - 如果你想繞一個不同點的對象,你不能因爲一個對象不能有兩個家長。

工作的下一個方法是將旋轉矩陣應用到對象的位置,例如:

//Make an object 
var object = new THREE.Mesh(new THREE.BoxGeometry(2,2,2), new THREE.MeshBasicMaterial()); 
//Move the object 
object.position.set(new THREE.Vector3(5,0,0); 

//Create a matrix 
var matrix = new THREE.Matrix4(); 
//Rotate the matrix 
matrix.makeRotationY(Math.PI/2); 

//rotate the object using the matrix 
object.position.applyMatrix4(matrix); 

再一次,這個工作,但似乎沒有辦法設置旋轉點。它始終是世界的起源。

另一種選擇是在sceneUtils一個實用的方法來分離從父對象,並附加一個新的父另一種方法的孩子,但該文件警告不要使用它,它從來沒有在任何示例代碼使用。

最終,我希望能夠使一個立方體遵循S形路徑,但沒有這個(看似)基本的東西,我發現它很困難。

tl; dr我想圍繞一系列不同點旋轉一個three.js對象。什麼是解決這個問題的好方法?

+1

看看是否有幫助:https://stackoverflow.com/a/32038265/1461008 – WestLangley

+0

這是有幫助的。謝謝。 – Chris

回答

1

這個答案可能會幫助:Three JS Pivot point

有幾種方法可以解決這個問題。正如你所提到的,你可以在父母方法中交換樞軸點,但是它將很多工作轉化爲將對象位置轉換爲/來自不同座標系。

相反,您可以隨時看是這樣(僞代碼):

  1. 移動對象的支點

    1.1。減去你的對象的原始位置

  2. 的支點應用的旋轉

  3. 由同一個位置矢量

    1.1搬回對象。 ADD的樞軸點到對象的位置

注:一切都在世界座標,所以你可能需要適當地轉換。

+0

這就是我如何做點旋轉。我將從我的位置減去數據透視表,通過'THREE.Quaternion()。setFromAxisAngle()'應用四元數旋轉,然後添加數據透視表並且它工作得很好。 –

+1

僅供參考,'THREE.Vector3.applyAxisAngle'在內部使用四元數,因此您可能不需要創建自己的(除非需要多次執行相同的操作)。 – TheJim01

+0

我正在使用'LineSegment',所以我有2個旋轉的點,但是對於未來的讀者來說很好記。 –

1

這工作,但它是令人難以置信的限制 - 如果你想繞一個不同點的 對象你不能因爲一個對象不能有 雙親。

這是真的,但我想知道你期望作爲有2個父母的默認行爲。你可以嵌套東西 - 例如,一輛汽車裏的女人擁有的攝像頭有兩層父母:攝像頭 - >女人 - >汽車。但是如果你想要一些平行的父母關係(?)可以說女人拿着相機,但你想讓男人同時拿着相機。你怎麼讓這個男人轉過身去拍電影而不從女人那裏拿走,反之亦然?當你試圖想象默認情況下,多個父母的想法會分崩離析。女人是否隨着相機移動?那麼在這種情況下,相機並不是她的父母嗎?

如果您想在父母之間進行切換,您可以隨時分離對象並將其附加到另一個對象。它警告你不要手動分離,因爲對象將從本地空間轉移到其父節點到世界空間/新父節點的本地空間。

Luckily there are some things in the scene utils meant for exactly this: namely attach and detach。所以當你想要傳遞一個物體而不需要從本地到世界的座標並傳送它怪異的地方時,你可以使用附加/分離功能。

請記住,這將做怪異的東西,除非newParent在切換時在前一位父母完全相同的位置,因爲我們不保證任何關於我們的對象與父母的關係,除了它將保持與切換時相同。 enter image description here

相關問題