THREE JS Удаление геометрии BOX из объединенной геометрии

1

У меня есть 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;

    }

Я получаю довольно случайные результаты. как слияние задает массив позиций, сливает ли он вершины или просто добавляет?

Теги:
three.js

1 ответ

0

Как видно из моих комментариев, число вершин между tmpBox и вершинами на поле в объединенной блокеModel не было одинаковым. Это изменение в вершинах было связано с тем, что оригинальное слияние было сделано из 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 вершины, а другой использует три вершины.

  • 0
    Путаница в этом оказалась из-за индексированных и неиндексированных геометрий. При оптимизации кода я обнаружил, что boxBufferGeometry использует индексные вершины из массива позиции, но после объединения он использует «суп из треугольников», а не индексированные вершины. На самом деле заканчиваем тем, что удаляем слияние все вместе и присваиваем массив позициям буферной геометрии напрямую.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню