簡體   English   中英

三.JS,改變世界 position 一個孩子 3D object

[英]Three.JS, changing the world position of a child 3D object

所以基本上我有一個組 Object3D 的子 object3D,而子對象的 [x,y,z] 坐標顯示相對於父 object 的 object 空間,我想在 3D 空間內更改子 object 的位置. 所以首先我得到子對象相對於世界空間的 position。

var wrld_pos = childobject.matrixWorld.multiplyVector3(new THREE.Vector3);

這將返回世界空間中孩子的 position 的三元素向量。 現在我想自己設置 position。 所以我創建了一個三元素向量。

var new_pos = THREE.Vector3();
new_pos.x = 1;
new_pos.y = 2;
new_pos.z = 3;

childobject.matrixWorld.setPosition(new_pos);

為 setPosition 提供 function 定義,它本質上是將對象的世界矩陣的最后三個元素設置為作為參數傳遞的向量的值,從而改變 object 在世界空間中的位置。 為了確保矩陣在這些更改后更新,我調用了以下函數。

childobject.matrixWorldNeedsUpdate = true;
childobject.updateMatrixWorld();

現在,在檢查 object 的新世界矩陣時,我注意到 setPosition function 什么也沒做,什么也沒做。

為什么? 如果需要真實的代碼示例,我會提供它們。 但是上面應該很准確的代表了我使用的應用領域和語法。

在three.js中,最好只調用object.position.set( x, y, z )object.rotation.set( ... )object.scale.set( ... ) ,而不是直接搞亂object.matrixobject.matrixWorld ,除非你真的知道你在做什么。

幕后發生的是這樣的:

object.matrixAutoUpdate的默認值為true

因此,在render()函數中, object.matrixWorld正在由object.postion的當前值更新,您沒有更改它。 所以,對你而言,似乎什么也沒發生。

這個答案可能對案件有所幫助。 從父母移除孩子,改變正常位置,然后再次附加。

如果在 animation 循環中使用attach設置 position 來移動物體,您可以使物體搖晃。

對我來說最好的解決方案是:

let newPosition = new THREE.Vector3(1,2,3);
let parentPosition = new THREE.Vector3();
childobject.parent.getWorldPosition(parentPosition);
childobject.position.set(
    newPosition.x-parentPosition.x,
    newPosition.y-parentPosition.y,
    newPosition.z-parentPosition.z
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM