2016-05-13 64 views
0

我有这样定义(与所有关于颜色和非位置东西的代码中省略)的IcosahedronGeometry顶点位置对象:three.js所 - 在另一个

var radius = 200; 
geometry = new THREE.IcosahedronGeometry(radius, 2); 

var materials = [ 
    new THREE.MeshPhongMaterial({}), 
    new THREE.MeshBasicMaterial({}) 
]; 
group1 = THREE.SceneUtils.createMultiMaterialObject(geometry, materials); 
group1.position.x = 0; 
// rotate a bit just so it spins off-axis 
group1.rotation.x = -1.87; 

这产生一个几乎是球形的,多对一双面形状。 我想在这个形状的几个顶点处放置小球体。假设有10个球体。我这样做是通过复制10个顶点到一个数组,像这样:

var vertexArray = []; 
for (var i = 0; i < 10; i++) { 
    vertexArray.push(geometry4.vertices[i]) 
} 

然后,我用的是载体复制到vertexArray设置位置关闭精灵:

for (var i = 0; i < vertexArray.length; i++) { 
    var loader = new THREE.TextureLoader() 
    var spriteMaterial = new THREE.SpriteMaterial(
     { 
      map: loader.load('/glow.png'), 
      blending: THREE.AdditiveBlending, 
      side: THREE.BackSide 
     }) 
    var sprite = new THREE.Sprite(spriteMaterial) 

    sprite.position.set(vertexArray[i].x, vertexArray[i].y, vertexArray[i].z) 
    // do i need rotate these by the same amount? 
    sprite.rotation.x = -1.87 
    scene.add(sprite) 
} 

这一切工作正常,除了Sprites不符合二十面体上的实际顶点,他们只是随机地(看似)坐在脸上的某个地方。偶尔一个精灵会坐在一个顶点上。

我复制顶点错了,还是在这里丢失了一个步骤?

+1

尝试'group1.add(精灵)',来代替。不要设置'sprite.rotation'。 – WestLangley

+0

哇,就是这样,谢谢。那么你可以将场景中的任何物体添加到同一场景中的其他物体上吗? – volx757

+0

是的。 ---------- – WestLangley

回答

0

添加一个对象作为父对象的子对象,并且该子对象将与父对象一起旋转。

使用这种模式,而不是:

var sprite = new THREE.Sprite(spriteMaterial); 

sprite.position.copy(vertexArray[i]); 

group1.add(sprite); 

three.js所r.76