【问题标题】:Three JS No Visual Update After Manually Editing Geometry三 JS 手动编辑几何后无视觉更新
【发布时间】:2015-02-16 04:53:16
【问题描述】:

所以我有一个 Geometry(这段代码的范围是 THREE.Geometry.prototype)并且我正在动态编辑。 newData 是 { faces: [array of face Indexes], vertices: [array of vertice index]} 的对象。 (这些数组保持原点面的长度和顶点数组的长度并保持形式 [null, null, null, "4", "5", null, null... ])

使用这些数组,我剥离所有面和顶点并将它们应用到 2 个新数组中的 1 个,从而有效地将所有数据分成 2 组。我还更新了脸上的指针!

最后我知道我已经更新了几何并且它是正确的,但是我所做的更改没有显示出来。我试过 .elementsNeedUpdate 导致错误。 (在 InitWebGlObjects 中没有未定义的属性 'a'...我看了看,看不到对 a 的引用)

我试过顶点需要更新,它什么也没做。

我还尝试将 updateCentroids 与之前的工具结合使用。它什么也不做。

我听说无法调整缓冲区大小。缓冲区和缓冲区的长度是多少?我给模型的顶点数量?

我已经看到“您可以通过预先分配更大的缓冲区然后保持不需要的顶点折叠/隐藏来模拟调整大小。”听起来这可能是我在做什么?如何折叠/隐藏顶点?我没有看到任何相关的参考。

感谢您的宝贵时间!

        var oldVertices = this.vertices
        var oldFaces = this.faces;

        var newVertices = []
        var newFaces = [];

        var verticeChanges = [];

        this.vertices = [];
        this.faces = [];        


        for(var i in oldVertices){
            var curAr = ((newData.vertices[i]) ? (newVertices):(this.vertices));
            curAr.push(oldVertices[i]);
            verticeChanges[i] = curAr.length-1;
        }

        for(var i in oldFaces){
            var curAr = ((newData.faces[i]) ? (newFaces):(this.faces));
            oldFaces[i].a = verticeChanges[oldFaces[i].a];
            oldFaces[i].b = verticeChanges[oldFaces[i].b];
            oldFaces[i].c = verticeChanges[oldFaces[i].c];
        }
        console.log('Vertices Cut from', oldVertices.length, "to:", newVertices.length, 'and', this.vertices.length);
        console.log('Faces Cut from', oldFaces.length, "to:", newFaces.length,  'and', this.faces.length);

【问题讨论】:

  • 你用的是哪个版本的three.js?
  • 我想我正在使用修订版 52,无论是最新的
  • 你能设置一个jsfiddle吗?
  • 您可能需要重新渲染几何图形。我认为不支持动态添加顶点。

标签: javascript three.js webgl


【解决方案1】:

我最近自己也遇到了这个问题。我发现如果我要向几何图形添加顶点和面,我需要设置this.groupsNeedUpdate = true 以便告诉渲染器更新它的内部缓冲区。

【讨论】:

    【解决方案2】:

    可能从this教程连接到这一点:

    “我只是想快速指出 Three.js 的一个快速陷阱,它 例如,如果您修改网格的顶点,您将 请注意在您的渲染循环中没有任何变化。为什么?好吧,因为 Three.js(据我所知)将网格的数据缓存为 某种优化。你真正需要做的是标记 到 Three.js,有些东西发生了变化,所以它可以重新计算任何东西 它需要。您可以通过以下方式执行此操作:

    // 将几何体设置为动态,以便允许更新

    sphere.geometry.dynamic = true;

    //改变顶点

    sphere.geometry.__dirtyVertices = true;

    // 法线变化

    sphere.geometry.__dirtyNormals = true;"

    【讨论】:

    • 是的,我已经尝试过这些。它们已重命名为 elementsNeedUpdate 和 verticesNeedUpdate 属性,这篇文章是旧的
    猜你喜欢
    • 2012-09-10
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多