【问题标题】:THREE JS Removing BOX Geometry from Merged Geometry三 JS 从合并几何中删除 BOX 几何
【发布时间】:2018-04-09 14:35:37
【问题描述】:

我有 100k+ 个盒子被添加到合并的几何图形中。我需要偶尔从这个合并的几何图形中删除一些几何图形。我可以按每个立方体 108 或 72 个顶点的步长循环位置属性以提取这些框的位置还是合并也合并顶点?

function blockCubeAlter(grid, blockModel) {

        function getGridElevation(n, e, grid) {
            var y_grid = Math.floor((grid.metaData.yMax - n) / grid.metaData.yStep) + 1;
            var x_grid = Math.floor((e - grid.metaData.xMin) / grid.metaData.xStep);

            var array_pos = Math.round(y_grid * (grid.metaData.nCol + 1) + x_grid);
            return isNaN(grid.elevations[array_pos]) ? Infinity : grid.elevations[array_pos];
        }

        var tmpBox = new THREE.BoxBufferGeometry(blockModel.x_step, blockModel.y_step, 2);

        var myBlock = scene.getObjectByName('blockModel');

        var pointsPerVertex = 3,
            vertexPerFace = 4,// this might be 3 triangles?
            facePerSide = 1, // this might be 2 triangles per face?
            sidePerBox = 6;

        var pointsPerCube = pointsPerVertex * vertexPerFace * facePerSide * sidePerBox;
        for (var i = 0, j = myBlock.geometry.attributes.position.array.length; i < j; i += pointsPerCube) {
            var above = false,
                below = false;

            for (var k = i; k < i + pointsPerCube; k += pointsPerVertex) {
                var n = myBlock.geometry.attributes.position.array[k + 1];
                var e = myBlock.geometry.attributes.position.array[k + 0];
                var z = myBlock.geometry.attributes.position.array[k + 2];
                if (z > getGridElevation(n + WEBGLyTranslate, e + WEBGLxTranslate, grid))
                    above = true;
                else
                    below = true;
                if (above && below) break; // intersect surface
            }
            if (above) {
                if (below) {
                    var newBoxGeometry = tmpBox.clone();
                    newBoxGeometry.attributes.position.array = myBlock.geometry.attributes.position.array.slice(i, i + pointsPerCube);
                    for (var materialGroupIndex = 0, z = myBlock.geometry.groups.length; materialGroupIndex < z; materialGroupIndex++) {
                        var myGeometryGroup = myBlock.geometry.groups[materialGroupIndex];
                        if (i >= myGeometryGroup.start && i < myGeometryGroup.start + myGeometryGroup.count) {
                            var newMaterial = myBlock.material.materials[myGeometryGroup.materialIndex].clone();
                            var mesh = new THREE.Mesh(newBoxGeometry, newMaterial)
                            scene.add(mesh);
                            break;
                        }
                    }
                }
                for (var k = i; k < i + pointsPerCube; k++) {
                    myBlock.geometry.attributes.position.array[k] = undefined;
                }
            }
        }

        myBlock.geometry.attributes.position.needsUpdate = true;

    }

我得到了相当随机的结果。合并是如何设置位置数组的,是合并顶点还是只是追加?

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    从我的 cmets 中可以看出,tmpBox 之间的顶点数与合并的 blockModel 中每个框的顶点数不同。顶点的这种变化是因为原始合并是从 boxGeometry 进行的,合并,然后转换为缓冲区几何。这就是合并网格的转换方式。

    finalGeometry = new THREE.BufferGeometry().fromGeometry(tmpGeometry);
    

    我能够通过使用以下方法创建 tmpBox 来解决该问题:

    var tmpBox = new THREE.BufferGeometry().fromGeometry(new THREE.BoxGeometry(blockModel.x_step, blockModel.y_step, 2));
    

    看起来很奇怪

    new THREE.BufferGeometry().fromGeometry(new THREE.BoxGeometry(blockModel.x_step, blockModel.y_step, 2)) != new THREE.BoxBufferGeometry(blockModel.x_step, blockModel.y_step, 2);
    

    但是它们有不同数量的顶点。我认为一个是使用 4 个顶点的面,另一个是使用三个顶点的面。

    【讨论】:

    • 这种混淆最终是因为索引几何与非索引几何。在优化代码时,我发现 boxBufferGeometry 使用位置数组中的索引顶点,但一旦合并它使用“三角形汤”,没有索引顶点。实际上最终将合并全部删除并直接将位置数组分配给缓冲几何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多