Three.js:添加和移除旋转对象的孩子

我试图模拟一个魔方。 我想随机select一张脸并旋转它。 所以我创build了27个立方体网格并定位它们。 你可以在这里看到工作(不正常)rubik的立方体http://codepen.io/theonepa1/full/fzAli

什么是问题。

从上面的链接可以看到,边上的小立方体以随机方式移动(至less不是我所期望的方式)

我做了什么。

当试图旋转脸部时,我已经将属于脸部的9个立方体添加为一个新的Object3D对象。 然后使用object3d.rotate.x(或y或z)沿着它的轴旋转object3d。

我debugging了什么

我已经确定我select的第二张脸旋转的立方体是正确的。 第一次脸部旋转完成后,我更新他们的虚拟位置(不是实际的坐标)。 所以对于第二次面部旋转,我已经validation了立方体被正确拾取。

究竟发生了什么

我所做的一个观察是,在旋转object3d(拥有一个面的9个立方体的父项)之后,立方体(较小的)轴被改变。 并且立方体的坐标也不会在脸部旋转后自动更新。 例如,如果其中一个立方体具有(0,0,22)作为面部旋转之前的坐标,则即使在旋转之后坐标也是相同的。 然而,立方体的轴的方向改变。

围绕轴旋转一组对象的最佳方法是什么? 使用Object3D是否正确? 我们是否应该在将其添加到另一个组中以进行第二次面部轮换之前,将其从一位父母中移除?

在将其添加到第二组进行第二次面部轮转之前,是否需要对各个立方体进行某种更新?

我已经阅读了一些关于applyMatrixWorld的文章,但我真的不明白它对轴的方向和立方体的坐标有何影响?

你可以让我知道我在哪里可以阅读像applyMatrixWorld这样的概念,在正常的3D编程中它是一种常见的概念吗?

这是一个很长的问题。 真的很感激你的回复:)

诀窍是使用THREE.SceneUtils.attach()THREE.SceneUtils.detach()

你需要从你的27个立方体开始,作为scene一个孩子。

让pivot是一个Object3D()

active是一个包含9个要旋转的立方体的数组。 现在让立方体成为枢轴的一个小孩:

 pivot.rotation.set( 0, 0, 0 ); pivot.updateMatrixWorld(); for ( var i in active ) { THREE.SceneUtils.attach( active[ i ], scene, pivot ); } 

然后,在旋转之后,将立方体放回scene小孩。

 pivot.updateMatrixWorld(); for ( var i in active ) { cubes[ i ].updateMatrixWorld(); // if not done by the renderer THREE.SceneUtils.detach( active[ i ], pivot, scene ); } 

阅读SceneUtils.js源文件,以便了解正在发生的事情。

三.js r.63