我有一个包含多个对象的threejs场景。当我选择一个并在屏幕上移动时,如果我选择> 1所有对象都放在与对象1相同的位置。但是它们需要保持原样。这是一些代码:
translateObjectTo(absX, absY, absZ) {
this.selectedObjects.forEach((selection) => {
if (absX !== null) {
selection.translateX(absX - selection.position.x);
}
...
});
}
如果我写selection.translateX(absX);它有效但当然错误的值
答案 0 :(得分:1)
Object3D.translateX
(和其他翻译方法)是相加的。这意味着,如果您的X值已经为5,并且您致电myMesh.translateX(5)
,那么您的新myMesh.position.x
将为10
。
为此,您需要计算拖动对象的原始position.x
及其新position.x
之间的差异,然后将其应用于所有其他对象。
这里有一些代码/伪代码作为一个非常宽松的例子。如果您希望在拖动时发生这种情况,则需要计算每个帧的差异(或者通常是您打算更新)。
// start dragging
originalPosition.copy(dragObject.position)
// drag is done (or you're ready to update)
let xDiff = originalPosition.x - dragObject.position.x
// apply this difference to all selected objects (except the dragged one)
selectedObjects.forEach(function(obj){
if(obj.id !== dragObject.id){
obj.translateX(xDiff)
}
})