【问题标题】:threejs move multiple objectsthreejs 移动多个对象
【发布时间】:2018-11-24 09:52:21
【问题描述】:

我有一个包含多个对象的threejs 场景。当我选择一个并在屏幕上移动时,它会起作用,如果我选择 > 1,则所有对象都放在与对象 1 相同的位置。但是,它们确实需要保持在原位。这是一些代码:

translateObjectTo(absX, absY, absZ) {
    this.selectedObjects.forEach((selection) => {
        if (absX !== null) {
            selection.translateX(absX - selection.position.x);
        }
        ...
    });
}

如果我写 selection.translateX(absX);它可以工作,但当然值错误

【问题讨论】:

  • 只是想澄清一下:您有 X 个对象分散在您的场景中。您选择所有这些。您在 +x 方向上拖动一个 5 个单位,因此您希望所有其他人从当前位置沿 +x 方向平移 5 个单位。这是一个适当的总结吗?
  • 是的,它是多物体场景。我想选择超过 1 个,然后相对于它们的原始位置沿轴移动它们(一个可以工作,两个它已经不起作用),例如对象 1 的位置是 (0,0,0),对象 2 的位置是 (1,0,0),因此将它们沿 x 轴移动 5 个单位应得到 (5,0,0) 和 (6,0) ,0)。

标签: typescript three.js


【解决方案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)
  }
})

【讨论】:

  • thx a lot 就像一个魅力,但老实说我不明白为什么:) 第一个对象与其他对象有何不同?如果我只是遍历所有选定的对象并应用距离(请参阅上面的代码 sn-p),它们都会被分配到对象 1 的位置,这就是我的问题的根源。你能启发我吗? :)
  • 原始代码的问题在于,您要从更改的距离中减去每个对象的原始位置。这从本质上将他们的新位置减少到翻译。
猜你喜欢
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多