【问题标题】:Three.JS, changing the world position of a child 3D object三.JS,改变子3D物体的世界位置
【发布时间】:2012-09-14 21:21:23
【问题描述】:

所以基本上我有一个组 Object3D 的子 object3D,而子对象的 [x,y,z] 坐标相对于父对象的对象空间显示,我想更改子对象在其中的位置3D空间。所以首先我得到子对象相对于世界空间的位置。

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

这将返回孩子在世界空间中的位置的三元素向量。现在我想自己定位。所以我创建了一个三元素向量。

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

childobject.matrixWorld.setPosition(new_pos);

提供了 setPosition 的函数定义,它本质上将对象世界矩阵的最后三个元素设置为作为参数传递的向量的值,从而改变对象在世界空间中的位置。为了确保矩阵在这些更改后更新,我调用了以下函数。

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

现在,在检查对象的新世界矩阵时,我注意到 setPosition 函数什么也没做,什么也没做。

为什么?如果需要真实的代码示例,我会提供。但是上面应该很准确的代表了我使用的应用领域和语法。

【问题讨论】:

    标签: javascript graphics webgl three.js


    【解决方案1】:

    编辑:答案已更新。


    您想要更改子对象的世界位置。

    假设场景没有应用任何变换,一种方法是使用以下模式:

    scene.attach( child ); // detach from parent and add to scene
    
    child.position.set( x, y, z );
    
    parent.attach( child ); // reattach to original parent
    

    Object3D.attach( child ) 方法添加子对象,同时保持子对象的世界变换。

    three.js r.132

    【讨论】:

    • 嗯,这就解释了为什么没有存储新的位置值。但这无助于改变物体的世界空间位置。
    • 例如,我们有两个组对象都是一个由 10 个立方体组成的环,我们希望一个环中的立方体与另一个环中的立方体交换位置,我们很容易做到这一点通过将原始立方体的位置设置为第二个立方体的位置,不幸的是,由于立方体的位置是相对于父对象的原点并且受对该对象所做的任何旋转和更改的主观影响,因此将其局部坐标设置为另一个环的坐标只会将立方体发送到随机位置。
    • 您是否希望能够设置孩子的位置,以便在应用父母的旋转矩阵后,孩子的新位置最终会出现在您指定的位置?
    • 这不是答案。
    • 是的,这是一个旧答案。答案已更新。
    【解决方案2】:

    这个answer 可能会对这个案子有所帮助。从父级移除子级,更改正常位置,然后再次附加。

    【讨论】:

      猜你喜欢
      • 2020-09-30
      • 2017-02-21
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2016-06-09
      • 1970-01-01
      相关资源
      最近更新 更多