2017-06-10 140 views
1

我有一個通過ObjectLoader加載的對象。我試圖克隆對象,替換它的材質,並在原始對象通過光線投射選擇時將其縮放到適當位置以用作選擇指示器。下面的代碼展示了我如何克隆對象,替換材質和縮放。縮放對象時的奇怪行爲

let selectionIndicatorMesh = mesh.clone(); 
selectionIndicatorMesh.material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); 
selectionIndicatorMesh.material.transparent = true; 
selectionIndicatorMesh.material.opacity = 0.4; 
selectionIndicatorMesh.scale.x = selectionGlowMesh.scale.x * 1.15; 
selectionIndicatorMesh.scale.y = selectionGlowMesh.scale.y * 1.15; 
selectionIndicatorMesh.scale.z = selectionGlowMesh.scale.z * 1.15; 
scene.add(selectionIndicatorMesh); 

當我增加x的規模,或y,從中心向外的對象尺度和變寬和深度的增加,奇怪的是...真正奇數部分是當我比例z值的對象不僅在高度上增加,而且沿Y軸向上移動一個看似任意的距離。 mesh.up{ x: 0, y: 1, z: 0 }

儘管在這一點上我完全困惑,但我對3D環境很陌生,所以我確信這有一個簡單的解釋,我出於某種原因找不到。我曾嘗試在使用mesh.geometry.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0, -(delta/2))進行縮放之前更改原點,但未成功。這會將對象移回Y軸,但原始對象並不完全包含在新對象內。

注意:selectionIndicatorMesh沒有組,場景是父級。

任何幫助將不勝感激!

回答

1

對於任何遇到這種情況的人,這裏是我如何解決它的。

let selectionIndicatorMesh = mesh.clone(); 
selectionIndicatorMesh.material = new THREE.MeshBasicMaterial({ color: 0x00ff00 }); 
selectionIndicatorMesh.material.transparent = true; 
selectionIndicatorMesh.material.opacity = 0.4; 

let box = new THREE.Box3().setFromObject(selectionIndicatorMesh); 
let offset = box.getCenter(); 

selectionIndicatorMesh.geometry.center(); 

selectionIndicatorMesh.position.set(offset.x, offset.y, offset.z); 

selectionIndicatorMesh.scale.x = selectionGlowMesh.scale.x * 1.15; 
selectionIndicatorMesh.scale.y = selectionGlowMesh.scale.y * 1.15; 
selectionIndicatorMesh.scale.z = selectionGlowMesh.scale.z * 1.15; 
scene.add(selectionIndicatorMesh); 
  1. 從網格創建Box3let box = new THREE.Box3().setFromObject(selectionIndicatorMesh);
  2. 保存對它的引用的補償:let offset = box.getCenter();
  3. 中心的網狀selectionIndicatorMesh.geometry.center();
  4. 設置你的網格的位置,以保存偏移selectionIndicatorMesh.position.set(offset.x, offset.y, offset.z);