Three.js:在场景中添加了Object3D,并附加到另一个object3D不会更新平移位置

时间:2019-02-26 19:37:40

标签: three.js

我的代码的逻辑例如是场景中包含的object3D,双击时会添加Line(带有BufferGeometry)。 我正在使用object3D相交得到Raycaster。 我添加它的方式是:

scene.add( newLine );
newLine.updateMatrixWorld();
THREE.SceneUtils.attach( newLine, scene, intersects[0].object );

以下是我的mousemove代码,可帮助我在XZ平面中移动object3D

function onDocumentMouseMove( event ) {
    var mouseX = ( event.clientX / window.innerWidth ) * 2 - 1;
    var mouseY = - ( event.clientY / window.innerHeight ) * 2 + 1;
    var mouse = new THREE.Vector2( mouseX, mouseY );
    raycaster.setFromCamera( mouse, camera);  
    if (selection) {
        var intersects = raycaster.intersectObject( plane );
        selection.position.copy( intersects[0].point.sub( offset ));
    }
}

没有什么复杂的。简单的代码。运动进展顺利。我可以轻松移动object3D

当我在抓住和移动控制台时检查控制台object3D的位置变化时,它正在发生变化,这应该发生。但是我的代码中Line(即newLine)的位置没有变化。问题是除非我要调用.updateWorldMatrix()以及应该在每个渲染周期中自动调用的三个文档。我仍然在打电话。当我在左右拖动newLine时,为什么object3D的位置明显与object3D一起移动,为什么还不能得到我的位置?

为什么需要它?除非该行的位置可以显示为变化,否则无法更新要附加到该行末尾的HTML元素。因此,位置变化势在必行。附带的Gif显示了当移动立方体/球体/圆锥体时,render(..)给出了改变位置日志。但是,当为Line记录相同内容时,它不会更改。如果有什么可以帮助我解决这个问题的,那就太好了。非常感谢。

enter image description here

编辑

当我将HTMLElement直接附加到父级object3D时,它会显示预期的结果。当我移动object3D时,它也会移动。这是因为如上所述,当我移动它时,其position在渲染周期中会不断更新。

Gif:

enter image description here

1 个答案:

答案 0 :(得分:1)

该行的.position属性未更改,因为其本地位置保持不变。由于该行已附加到父级,因此它与父级的相对位置不会更改,只有全局位置会更改。要获取line的全局位置,可以使用.getWorldPosition()方法:

// Declare var to store world position
var worldPos = new THREE.Vector3();

// Get world position of line
line.getWorldPosition(worldPos);

// Now global position is stored in Vec3
console.log(worldPos);