我的代码的逻辑例如是场景中包含的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
记录相同内容时,它不会更改。如果有什么可以帮助我解决这个问题的,那就太好了。非常感谢。
编辑
当我将HTMLElement
直接附加到父级object3D
时,它会显示预期的结果。当我移动object3D
时,它也会移动。这是因为如上所述,当我移动它时,其position
在渲染周期中会不断更新。
Gif:
答案 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);