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