考虑场景和3 BoxBufferGeometries
,我不想重新渲染场景(drawObjects
被称为一次,“第一次”),而是对其进行更新({{1 }}例如在用户操作上被调用),以下代码成功更新了场景中所有对象的颜色和纹理材质属性,但在进行mesh.geometry转换时似乎只影响这三个对象之一(一个变成球体,另外2个仍然是正方形),为什么? (live example)
updateScene
我也尝试了其他几种方法,第一种方法是关于更新顶点(如指示的here),但是由于BoxGeometry没有顶点,所以它不起作用。然后我不得不添加一些选项,例如,但没有成功。
drawObjects = (options) ->
map = (new (THREE.TextureLoader)).load(options.texture)
map.wrapS = map.wrapT = THREE.RepeatWrapping
map.anisotropy = 16
material = new (THREE.MeshToonMaterial)(
color: options.color
map: map
transparent: true
side: THREE.DoubleSide)
geometry = new THREE.BoxBufferGeometry( 20, 20, 20 )
i = 0
while i < 3
object = new (THREE.Mesh)(geometry, material, (color: Math.random() * 0xffffff))
object.position.x = Math.random() * 800 - 400
object.position.y = Math.random() * 800 - 400
object.position.z = Math.random() * 800 - 400
object.setGeometry = ->
geometry = new THREE.SphereGeometry(20)
object.geometry = geometry
return
object.setTexture = (texture) ->
object.material.map = new THREE.TextureLoader().load( texture )
return
object.setColor = (color) ->
object.material.color = new THREE.Color(color)
return
scene.add object
i++
updateScene = (options) ->
@scene.traverse (object) ->
if object.isMesh == true
object.setColor(options.color)
object.setTexture(options.texture)
object.setGeometry()
return
第二个方法是使用# object.geometry.dynamic = true
# object.geometry.buffersNeedUpdate = true
# object.updateMatrix()
基本上是对原始网格物体的克隆,如建议here放置原始网格物体并用其克隆网格代替,例如,但由于我的原因它不起作用我有需要重新使用的附加到该对象的函数。也许我做错了:
object dispose
我敢肯定有一种方法可以实现这种mesh.geometry转换并将其遍历场景时应用于每个对象,但是找不到方法。
亲切的问候
答案 0 :(得分:0)
最终使用对象本身之外的功能来完成此操作:
setGeometries = (geometry) ->
@scene.traverse (object) ->
if object
object.geometry = geometry
object.geometry.buffersNeedUpdate = true
return
return
return
geometry
与new THREE.[Primitive]BuffferGeometry
类似。为我工作。