c# Unity 3D-координаты карты синхронизации - PullRequest
0 голосов
/ 20 января 2020

Я работаю над процедурно сгенерированной картой / игрой. У меня есть 3D куски с 20x20x20 точек в 3D массиве. Я использую алгоритм марширующих кубов для генерации кусков. Я пытаюсь манипулировать плотностью с помощью сложения и вычитания значений, но в то же время пытаюсь синхронизировать c соседние порции с краем вместе с изменением чанка. adding density to a chunk's points

Здесь это код, который мне нужен, но он не работает:

`for (int i = 0; i < 9; i++)
    {
        Chunk nChunk = neighbours[i].GetComponent<Chunk>();
        if (i == 4) continue; //skip self
        for (int z = 0; z < 20; z += 19)
        {
            for (int x = 0; x < 20; x += 19)
            {
                for (int zz = 0; zz < 20; zz += 19)
                {
                    for (int xx = 0; xx < 20; xx += 19)
                    {
                        for (int y = 0; y < 20; y++)
                        {
                            if (Points[xx, y, zz].wPosition == nChunk.Points[x, y, z].wPosition)
                                nChunk.Points[x, y, z].density = Points[xx, y, zz].density;
                        }
                    }
                }
            }
        }
    }`

Я хочу проверить края, а не все точки, чтобы сохранить производительность. y координирует высоту.

Вот как я это называю:

        //mouse click
    if (Input.GetMouseButtonDown(0))
    {
        Ray raym = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hitm;
        if (Physics.Raycast(raym, out hitm))
        {
            if (hitm.transform.GetComponent<Chunk>())
            {
                Chunk cScript = hitm.transform.GetComponent<Chunk>();
                for (int z = 0; z < 20; z++)
                {
                    for (int y = 1; y < 19; y++)
                    {
                        for (int x = 0; x < 20; x++)
                        {
                            if (PointInsideSphere(cScript.Points[x, y, z].wPosition, hitm.point, 1f))
                                cScript.Points[x, y, z].density -= 0.1f;
                        }
                    }
                }
                cScript.SyncNeighbours();
            }
        }
    }

enter image description here

Таким образом, это работает хорошо, но я хочу проверить только края.

        for (int i = 0; i < 9; i++)
    {
        Chunk nChunk = neighbours[i].GetComponent<Chunk>();

        if (i == 4) continue; //skip self
        for (int z = 0; z < 20; z ++)
        {
            for (int x = 0; x < 20; x ++)
            {
                for (int zz = 0; zz < 20; zz ++)
                {
                    for (int xx = 0; xx < 20; xx ++)
                    {
                        for (int y = 0; y < 20; y++)
                        {
                            if (Points[xx, y, zz].wPosition.x == nChunk.Points[x, y, z].wPosition.x && Points[xx, y, zz].wPosition.y == nChunk.Points[x, y, z].wPosition.y && Points[xx, y, zz].wPosition.z == nChunk.Points[x, y, z].wPosition.z)
                                nChunk.Points[x, y, z].density = Points[xx, y, zz].density;
                        }
                    }
                }
            }
        }
    }

    for (int j = 0; j < 9; j++)
    {
        neighbours[j].GetComponent<Chunk>().UpdateChunk();
    }

1 Ответ

0 голосов
/ 21 января 2020

Это решается по-другому: когда игра создает чанк, она проверяет точки с 0 и 19 позициями в трехмерном массиве, а затем добавляет их в список. из этого списка я могу проверить точки на соседних гранях и сделать плотности равными.

...