【发布时间】: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