2016-11-21 124 views
0

當我將一個Object3D添加到另一個Object3D(「添加」方法)時,該子項根據父項的變化更改其變換。Three.js add:保留位置

有沒有辦法在孩子添加到父母后保持位置/旋轉/縮放比例?

小提琴:https://jsfiddle.net/pqfzd8a2/1/

mesh = new THREE.Mesh(geometry, material);  
mesh.position.y = 25; 

var mesh2 = mesh.clone(); 
mesh2.position.y = 80; 

var mesh3 = mesh2.clone(); 

mesh.rotation.z = Math.PI*0.25; 

scene.add(mesh);  
mesh.add(mesh2); 
scene.add(mesh3); 

做了什麼?

  1. 網格被旋轉。
  2. mesh2和mesh3是相互位置相同的克隆。
  3. 將mesh2添加到網格中,同時將mesh3添加到場景中。

mesh2和mesh3之間的區別在於它們被添加(父)到不同的父母(以相應地網格化和直接到場景)。在被添加(父)之前,他們處於相同的位置。重點是保持對象在被添加之前的位置(父對象)。

預期結果:mesh2和mesh3應該在相同的位置。

實際結果:mesh2在添加後改變位置/旋轉/縮放比例。

如何使對象在被父對象保持其全局變換?

+0

什麼確切的是用例是什麼?爲什麼你真的需要一個子對象,它應該在層次結構的父級別?你爲什麼不能把孩子轉移到另一個階段? – philipp

回答

0

那麼這就是定義的行爲,至少是存在這些層次結構的原因。如果您不希望將父母的變換應用於孩子,則沒有理由將這些項目父母親。

使用這種方法處理複雜的物體要容易得多,這些複雜的物體由較小的物體組成,例如帶車輪的汽車。而不是移動汽車,然後移動每個車輪,而是移動汽車的車輪,並且它們一直移動/旋轉/縮放。這就是父母的轉變如何被所有的孩子「繼承」。所以他們的轉變是相對他們各自的父母。就像月亮圍繞地球旋轉,圍繞太陽旋轉,圍繞太陽旋轉,它圍繞着天空轉動...

如果您確實需要取消父母在孩子內部的轉換,那麼您需要將父母轉換的逆應用於孩子的轉變,但正如我所說,這沒有多大意義,因爲你只是不需要父母和你的完成。

0

不,他們不應該在相同的位置,因爲你正在改變網格和mesh2的位置和旋轉。如果您要將網格添加到另一個網格,則將其添加到父上下文。

mesh.add(mesh2); // <-- mesh is translated and rotated, mesh2 will inherit the same context 

在這撥弄你看到,網格旋轉也適用於mesh2:https://jsfiddle.net/r57opdgn/

+0

是的,我將它添加到父上下文中。但如何讓孩子保持自己的地位? – Dmitry

+0

當您將'mesh2'添加到'mesh'時,如果您想在'mesh'的空間中保留'mesh2'在相同的平移位置,則在場景中也會更改上下文('mesh'是原點) position.y'歸零:'mesh2.position.y = 0'。如果你想使用全局座標軸,你不應該把'mesh2'設置爲'mesh'的子節點。 – Marcs