Javascript three.js使用raycaster.intersectObject选择Object3D的子对象

Javascript three.js使用raycaster.intersectObject选择Object3D的子对象,javascript,arrays,object,three.js,parent-child,Javascript,Arrays,Object,Three.js,Parent Child,我正在尝试制作一系列的立方体,可以点击来突出显示它们。这将使我能够改变它们的颜色或添加纹理或以某种方式操纵它们。我已经浏览了上所有交互式示例的源代码,似乎每个示例都使用了稍微不同的方式来创建和选择场景中的对象。不过,我不习惯使用javascript,所以可能我遗漏了一些简单的东西 我创建了一个名为blocks的Object3D类来存储所有的立方体 blocks = new THREE.Object3D() 我使用for循环创建一个9 x 9的立方体数组,从(0,0,0)坐标开始,它们之间有一点

我正在尝试制作一系列的立方体,可以点击来突出显示它们。这将使我能够改变它们的颜色或添加纹理或以某种方式操纵它们。我已经浏览了上所有交互式示例的源代码,似乎每个示例都使用了稍微不同的方式来创建和选择场景中的对象。不过,我不习惯使用javascript,所以可能我遗漏了一些简单的东西

我创建了一个名为blocks的Object3D类来存储所有的立方体

blocks = new THREE.Object3D()
我使用for循环创建一个9 x 9的立方体数组,从(0,0,0)坐标开始,它们之间有一点间隙,然后将()它们添加到块中,将()块添加到场景中。示例:(立方体大小2,2,2)

这将使所有子对象都可以单击,但它们与创建的第一个对象具有相同的.id。因此,如果我尝试使用.getObjectById()来更改某些内容,它将不起作用

我尝试生成每个元素,并将它们迭代地添加到场景中,而不是创建一个对象数组来保存它们,它仍然具有类似的效果。我尝试将它们存储在一个常规数组中,然后使用true参数递归搜索.intersectObject()数组,但当我单击它时,它会选择所有对象

var intersects = raycaster.intersectObjects(blocks, true);
我考虑过创建81个唯一的变量来保存每个元素,并静态地键入一个包含81个变量的数组(绝望选项),但我找不到一种安全的方法来在for循环中动态创建变量名来保存对象。这种方法被发布在stackoverflow上,作为创建不同命名变量的解决方案,但它似乎根本没有创建变量

for (var i=0, i<9, i++){
    var window["cube" + i] = new THREE.Mesh( Geometry, Material)
    {

对于(var i=0,i我认为您遇到此问题的原因是您参考相同的
材质来构建
网格
,您确实在
块中与单个对象相交。子对象
,但当您更改材质的某些属性时,使用该材质的其他网格也会更改

function line(mx,my,mz){
    for (var i = 0;i<9;i++){
      material = new THREE.MeshLambertMaterial({color: 0xffffff});
      var block = new THREE.Mesh( Geometry, material);
      block.position.x = mx;
      block.position.y = my;
      block.position.z = mz;

      blocks.add(block);
      mx+=3;
    }
}
功能行(mx、my、mz){
对于(var i=0;i
for (var i=0, i<9, i++){
    var window["cube" + i] = new THREE.Mesh( Geometry, Material)
    {
function line(mx,my,mz){
    for (var i = 0;i<9;i++){
      material = new THREE.MeshLambertMaterial({color: 0xffffff});
      var block = new THREE.Mesh( Geometry, material);
      block.position.x = mx;
      block.position.y = my;
      block.position.z = mz;

      blocks.add(block);
      mx+=3;
    }
}