6

タイトルがあまり説明的でない場合は申し訳ありません。とにかく、私はランダムに生成される風景を扱うことに取り組んでいます。湖を作成しましたが、その作成方法が原因で、望ましくないストレート エッジ/ドロップオフが発生することがよくあります。最大変動量を定義して(可能であれば、湖を作成した直後に)滑らかにしようとしています(したがって、土地の高さはそれ以上変動することはできません)。変動が大きすぎる場合は土地を修正し、そうであれば終了します大丈夫。

問題:

大きなドロップオフ

私の試みた修正:

修正を試みました

ご覧のとおり...うまくいきませんでした。それは私にも起こります。下に移動しなければならない場合は壊れると思いますが、実際には発生しないはずです。なぜなら、湖は風景を沈めるだけだからです。とにかく、ここに私の試みのソースがあります:

//smoothing land nearby

            int maxVariation = 2; //similar to the max height variation when the land is generated

            //going right



            for (int xPos = rightBound + 1, previousHeight = 0; ; ++xPos)
            {
                if (previousHeight == 0)
                    for (; previousHeight < size.y; ++previousHeight)
                        if (grid[0][rightBound][previousHeight] != BlockColor::DIRT && grid[0][rightBound][previousHeight] != BlockColor::GRASS)
                        {
                            --previousHeight;

                            break;
                        }


                for (int y = 0; y < size.y; ++y)
                    if (grid[0][xPos][y] == BlockColor::WATER)
                        goto done_smoothing_right;

                int height;

                for (height = 0; height < size.y; ++height)
                    if (grid[0][xPos][height] != BlockColor::DIRT && grid[0][xPos][height] != BlockColor::GRASS)
                    {
                        --height;

                        break;
                    }

                    int difference = std::abs(height - previousHeight);

                    previousHeight = height;

                    if (difference > maxVariation)
                    {
                        for (int j = 0; j < size.y; ++j)
                        {
                            int toMove = difference;

                            while (j + toMove >= size.y)
                                --toMove;

                            grid[0][xPos][j] = grid[0][xPos][j + toMove];
                        }
                    }
                    else
                        goto done_smoothing_right;


            }

done_smoothing_right:

            int tomakegotowork;

右側のみですが、左側もほぼ同じであることに注意してください。どうすればこれを正しく行うことができますか?

あなたが助けることができればありがとう。

編集:

私はこの問題を決して解決しませんでした。代わりに、(特定の高さから)空気を測定し、(土地によって形成された)空気のポケットが十分にある場合は水で満たす再帰関数を作成しました。これには、変更されていないため、土地が滑らかに見えるという利点があります。

4

1 に答える 1

1

これは Java で書かれているので、C++ に変換する必要がありますが、基本的な考え方は理解できるはずです。上向きのスムージングにも機能し、私は湖の右側のみを行いましたが、湖の左側に合わせて変更するのは非常に簡単です。私はあなたのコードの機能が何であると思うかを一致させようとしました.

それが役に立てば幸い...

void smoothLakeRight(Lake lake){

    int x = lake.rightBound+1;

    if(getGrassHeight(x)-lake.height>WorldConstants.MAX_LAKESIDE_VARIATION){
        //if the right bank is too high start smoothing
        int y =lake.height+WorldConstants.MAX_LAKESIDE_VARIATION;

        while(grid[0][x][y] == BlockColor.DIRT){
            fixGrass(x++, y++);
        }
    }
}

private int getGrassHeight(int xPos){

    int y = WorldConstants.LOWEST_GRASS;

    while(grid[0][xPos][y++] != BlockColor.GRASS);

    return y-1;
}

private void fixGrass(int xPos, int yPos){

    grid[0][xPos][yPos] = BlockColor.GRASS;

    aboveAir(xPos,yPos);
    belowDirt(xPos, yPos);

}

private void aboveAir(int xPos, int yPos) {

    while(grid[0][xPos][++yPos]!=BlockColor.AIR){
        if(grid[0][xPos][yPos]==BlockColor.TREE){
            upRootTree(xPos, yPos);
        }else{
            grid[0][xPos][yPos]=BlockColor.AIR;
        }
    }
}

private void upRootTree(int xPos, int yPos) {

    while(grid[0][xPos][yPos]==BlockColor.TREE){//remove stump
        grid[0][xPos][yPos++]=BlockColor.AIR;
    }

    //remove leaves
    grid[0][xPos][yPos] = BlockColor.AIR;
    grid[0][xPos+1][yPos] = BlockColor.AIR;
    grid[0][xPos-1][yPos] = BlockColor.AIR;
    grid[0][xPos+1][yPos-1] = BlockColor.AIR;
    grid[0][xPos-1][yPos-1] = BlockColor.AIR;
}

private void belowDirt(int xPos, int yPos) {

    while(grid[0][xPos][--yPos]!=BlockColor.DIRT){
        grid[0][xPos][yPos] = BlockColor.DIRT;
    }
}
于 2013-07-11T18:31:28.437 に答える