0

我正在寻找连接具有来自 IndexedDB 的真实高程数据的平面缓冲区几何网格图块。我的问题是 STRM 高程上的数据分辨率并不完美,因此瓷砖之间的边缘不一样。我需要将接触顶点之间的所有网格边缘平均化,以创建无缝地形。

当我将代码复制粘贴到场景中的控制台时,它可以工作。然而只是在代码中它没有。传递的 sceneRef 是有效的,并且代码库的其余部分正确使用了 sceneRef。

瓦片是 3 x 3,当前网格瓦片是 0,0 - 2,2 范围内 1,1 的中心。

function connectTiles(currGridKey, sceneRef){
console.log("connectTiles");
console.log("currGridKey");
// Current Tile Connection
for (var lat = 0; lat < currGridKey[0]+2; lat++) {
    for (var long = 0; long < currGridKey[1]+2; long++) {
        const currentTile = sceneRef.getObjectByName(`${lat}-${long}`); 
        // Current Grid Tile Per Loop
        if (currentTile) {
            const currentTileVerts = currentTile.geometry.attributes.position.array,
                  latPlusTile = sceneRef.getObjectByName(`${lat}-${long+1}`),
                  longPlusTile = sceneRef.getObjectByName(`${lat+1}-${long}`);

            // Connect Latitudinally
            if (latPlusTile) {
                const latPlusTileVerts = latPlusTile.geometry.attributes.position.array;
                for (var z = 0; z < currentTileVerts.length; z+=27) {
                    const newVertHeight = (currentTileVerts[z] + latPlusTileVerts[z]) / 2;
                    latPlusTileVerts[z] = newVertHeight;
                    currentTileVerts[z] = newVertHeight;
                }
                latPlusTile.geometry.attributes.position.needsUpdate = true;
                currentTile.geometry.attributes.position.needsUpdate = true;
            }
            // Connection Longitudinally
            if (longPlusTile) {
                const longPlusTileVerts = longPlusTile.geometry.attributes.position.array;
                for (var x = 0; x < currentTileVerts.length; x+=3) {
                    const newVertHeight = (currentTileVerts[x] + longPlusTileVerts[x]) / 2;
                    longPlusTileVerts[x] = newVertHeight;
                    currentTileVerts[x] = newVertHeight;
                }
                longPlusTile.geometry.attributes.position.needsUpdate = true;
                currentTile.geometry.attributes.position.needsUpdate = true;
            }       
        }
    }
}
4

1 回答 1

0

如果数组中的所有值实际上都在更新,那么它们可能只是没有上传到 GPU。不要直接更改内部的值geometry.attributes.position,而是尝试使用.setAttribute()method。文档指出使用.setAttribute()and.getAttribute() 比直接访问它更可取,因为它有自己的内部存储机制。

const latPlusTileVerts = latPlusTile.geometry.getAttribute("position").array;
// ... Loops
latPlusTile.geometry.getAttribute("position").needsUpdate = true;

// Or an alternative is to generate a new attribute...
// in case updating the old one fails 
const posAttrib = new THREE.BufferAttribute(latPlusTileVerts, 3);
latPlusTile.geometry.setAttribute("position", posAttrib);
于 2020-02-21T22:42:59.003 回答