Terrain Quadtree LOD无法检测出T形接头出现裂缝的位置

时间:2018-04-20 22:58:37

标签: algorithm webgl terrain

我实现了一个存储具有不同LOD级别的单个数据网格的四叉树,其中每四个子节点都有自己的顶点及其对应的索引到四个角(x0,y0,x1,y1 - >从上到下)它构成了相应的LOD级别。

QuadTree.prototype.fillTree = function(currentNode, depth, currentBox, currentIndex) {
    if(depth === 0 || !currentBox.checkPartition())
        return;

    let node = {
        "vertices" : [],
        "lines" : [],
        "children" : [],
        "box" : currentBox
    };

    currentNode.push(node);

    currentBox.getVerticesCoord(this.cols, currentIndex).forEach((coord) => {
        this.getPlaneVertices(node.vertices, coord);
    });

    currentBox.getLinesCoord(this.cols, currentIndex).forEach((coord) => {
        this.getPlaneVertices(node.lines, coord);
    });

    currentBox.getPartitions().forEach((box, index) => {
        this.fillTree(node["children"], depth-1, box, index);
    });
};

我还有一个checkFrustumBoundaries方法,我计算LOD级别和摄像机位置[0,0,0]之间的最小距离,并检查它是否在所有坐标的[-1,1]范围内可见通过乘以投影矩阵并除以w。

最后,我有一种方法,通过查找相机原点与相应深度之间的最小距离来选择当前状态所需的LOD级别,并检查所有4个孩子是否在可见区域内并将它们存储到一个阵列中被渲染。

注意:如果他准备好渲染,我希望孩子们以最低的复杂度水平继承他们兄弟的深度,因此我将总是拥有一个具有相同LOD水平的4个四方。< / p>

QuadTree.prototype.readComplexity = function(projection, viewCamera, currentNode, currentIndex, currentDepth = 1) {
    let childrenToBeRendered = [];
    let minDepth = this.depth;

    currentNode.children.forEach((child, index) => {
        let frustumBoundaries = this.checkFrustumBoundaries(child.vertices, projection, viewCamera);

        if(frustumBoundaries.withinFrustum) {
            //Section is the 1.0/this.depth
            let depth = this.depth-Math.ceil(frustumBoundaries.minDistance/this.section);

            minDepth = Math.min(minDepth, depth);

            childrenToBeRendered.push({
                "child" : child,
                "index" : index
            });
        }
    });

    childrenToBeRendered.forEach((child => {
        if(minDepth <= currentDepth) {
            //Even complexity, or the others quarters inherits on of their siblings with lowest complexity level
            this.fetchLines(projection, viewCamera, child.child, currentDepth, child.index);
        } else if(minDepth > currentDepth) {
            //Needs more complexity because it's too near to camera origins
            this.readComplexity(projection, viewCamera, child.child, child.index, currentDepth+1);
        }
    }));
};

但在这里我偶然发现了最大的问题,看来T型接头导致不同LOD级别之间出现裂缝:

T-junction

我发现我可以通过使用堆栈禁用构成T型交叉点的顶点来移除裂缝,然后将2个顶点附加到半个菱形上并使用下面的子项我使用他的顶点index与前两个使用的不同。骑自行车,从左上角到右上角,右下角,左下角开始,带有一面旗帜,以防他右上角和左邻居之间存在LOD差异。

enter image description here

但在此之前,我需要知道孩子的邻居是否具有较低的复杂性或相等,因此如果孩子说的是左上角,我需要知道左边和顶部是否有LOD级别四倍的空间和逻辑的复杂性较低。

我如何设法做到这一点,如果他们可以位于不同的四叉树级别,如果我尝试使用节点的框来生成两个邻居的框并计算它们的深度,我怎么能到达邻居呢?无法将它们与节点进行比较,因为在选择过程中,邻居可能会继承其兄弟姐妹的深度,因此比较将是错误的。但是,如果我选择不使用四法则,那么我就不能使用上面提到的钻石选择策略。

0 个答案:

没有答案