ThreeJS,在运行时更新mesh.geometry

时间:2018-07-22 13:21:04

标签: three.js

考虑场景和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转换并将其遍历场景时应用于每个对象,但是找不到方法。

亲切的问候

1 个答案:

答案 0 :(得分:0)

最终使用对象本身之外的功能来完成此操作:

setGeometries = (geometry) ->
    @scene.traverse (object) ->
        if object
            object.geometry = geometry
            object.geometry.buffersNeedUpdate = true
            return
        return
    return

geometrynew THREE.[Primitive]BuffferGeometry类似。为我工作。