L-Systems를 사용하여 도시를 절차 적으로 생성


10

현재 절차 적으로 생성 된 콘텐츠에 많은 초점을 맞춘 앱을 만들고 있습니다. 지금까지 단면 노이즈를 사용하여 지형 및 모양의 절차 생성을 성공적으로 구현했습니다. 나는 그것이 어떻게 보이는지 정말 기쁘게 생각합니다. 이제 저는 도시에서도 똑같이하려고합니다. 거리와 건물의 2D 레이아웃을 생성하기 만하면됩니다. 나는 그것을 조사했으며 대부분의 사람들이 L-Systems를 사용하는 것이 좋습니다. 그러나 나는 그들 주위에 머리를 감쌀 수 없다. 나는 개념을 얻었지만 구현을 코드로 만들지는 않았다. 절차 적으로 생성 된 도시에 대한 L- 시스템의 코드 예제 나 도시를 처리하는 다른 방법에 대한 제안이 있습니까?



L- 시스템을 위한 +1 Hurray !
— luser droog

내가 비슷한 것을 한 방법은 교차점을 나타내는 노드 그리드를 만든 다음 인접한 노드를 임의로 연결하는 것입니다. 미로 같은 레이아웃을 만들지 만 거리가 모두 연결되어 있지는 않으므로 실제로 탐색 할 수 없습니다.
— user137

도시 생성 L- 시스템에 대해 일반적으로 인용되는 주제는 Parish and Müller의 논문 : 도시의 절차 적 모델링입니다 . 나는 또한 구현 의 훌륭한 예를 발견했다 . 시작하기에 좋은 곳이지만 정확한 요구 사항에 따라 주변 환경을 변경해야 할 수도 있습니다.
— Anders Ryndel

답변:


20

내가 말할 수있는 L-Systems 는 흥미로운 "유기적"결과를 얻기 위해 재귀 적으로 적용 할 수있는 일련의 문법과 같은 대체 규칙입니다.

식물은 L-Systems가 자주 사용되는 곳입니다. 그들은 많은 재귀 적 성장을 보입니다 (즉, 가지가 더 많은 가지로 나뉘어 짐). 간단한 예를 들어, L-System을 사용하여 생성 된 "롤리팝"트리를 보여 드리겠습니다.

variables : | o              (these are the things that will grow)
start  : o
         |                   (this is what we start with)
rules  : (o → o   o)         (these are the substitution rules that we apply
               \ /            one step at a time)

따라서 1 세대에서 우리는 시작했습니다.

o
|

2 세대에서는 각 규칙을 따르고 규칙에 따라 기존 부품을 대체합니다. 우리는 "공"을 "2 개의 막대기와 공"으로 대체합니다 :

o   o
 \ /
  |

세대 3 :

o o   o o
 \|   |/
   \ /
    |

곧 우리는 예쁜 (크 래피) 큰 나무를 가질 것입니다!

코드에서이 작업을 수행하려면 임의의 끝에 도달 할 때까지 동일한 부분에 규칙을 계속 적용하거나 재귀 적으로 (예 : DFS)이 작업을 수행하거나이 예제에서 수행 한 것처럼 반복적으로 (예 : BFS) 수행 할 수 있습니다. 모든 요소에 대해 하나의 규칙 "통과"를 수행하고 여러 단계를 반복합니다. 그건:

재귀 적으로 :

tree = start
grow(tree, start)

func grow(tree, part)
    if this part of the tree is big enough
        stop
    if part is 'o'
        replace part with 'o\/o'
        grow(tree, the left 'o')
        grow(tree, the right 'o')

반복적으로 :

tree = start
for a number of iterations
    for each part in tree
        if part is 'o':
            replace with 'o\/o'

L-Systems의 많은 사용은 하위 부문을 사용하여 "성장"단계를 수행합니다. 즉, "성장"함에 따라 부품이 점점 작아지고, 더 큰 부품은 나뉘어집니다. 그렇지 않으면 성장 시스템이 자체적으로 겹치기 시작할 수 있습니다. 롤리팝 트리 예제에서 볼 수 있듯이 새 가지의 모양을 변경하여 두 가지 가지가 중간에 겹치지 않도록 마술로 보장했습니다. 세분화를 사용하여 도시의 예를 봅시다 :

variables: block_vertical block_horizontal road_vertical road_horizontal
start: block_vertical
rules: (block_vertical → block_horizontal road_vertical block_horizontal)
       (block_horizontal → block_vertical road_horizontal block_vertical)

이것은 잠시 후에 의미가 있습니다.

1 세대

+--------------------+
|                    |
|                    |
|                    |
|        V           |
|                    |
|                    |
|                    |
+--------------------+

지루한 단일 수직 블록. (V는 세로를 나타냅니다.)

2 세대 : 수직 블록을 수평 블록으로 대체하고 중간에 수직 도로를 배치합니다.

+--------------------+
|       r            |
|       r            |
|       r            |
|   H   r      H     |
|       r            |
|       r            |
|       r            |
+--------------------+

R은 도로를 의미합니다! 나는 무작위로 간격을 두 었으며 PCG에서 지루한 정규 부품을 원하지 않습니다.

3 세대 : 수평 블록을 수평 도로로 분리 된 수직 블록으로 교체합니다. 기존 도로는 그대로 있습니다. 그들에게는 규칙이 없습니다.

+--------------------+
|   V   r            |
|       r            |
|rrrrrrrr            |
|       r      V     |
|   V   r            |
|       rrrrrrrrrrrrr|
|       r      V     |
+--------------------+

도로가 서로 어떻게 연결되어 있는지 확인하십시오. 이것을 충분히 반복하면 다음과 같은 결과가 나옵니다 ( 관련 답변을 찢어 버렸 습니다 ).

여기에 이미지 설명을 입력하십시오

내가 다루지 않은 많은 세부 사항이 있으며,이 결과는 "분명히"생성 된 것처럼 보입니다. 실제 도시는 다소 다르게 보입니다. 그것이 PCG를 재미있게 만드는 이유입니다. 결과를 조정하고 개선하기 위해 할 수있는 일이 많이 있지만 L-Systems와 관련이 없으므로이 답변을 여기에 남겨 두겠습니다. 이것이 당신이 시작하는 데 도움이되기를 바랍니다.

*-문법과 PCG 식물과 같은 특정 유형에 직면했지만 L-Systems를 공식적으로 연구하지는 않았습니다. 정의 나 개념이 틀리면 수정 해주세요


1

@ congusbongus 답변이 훌륭합니다. 몇 가지를 추가하겠습니다.

블록을 경계로하는 모든 도로에 따라 블록을 빌딩 영역으로 분할해야합니다. 도로가 사방에있을 때 전체적인 패턴은 링입니다. 예를 들어이 링크를 참조하십시오 : http://oldurbanist.blogspot.fr/2012/01/city-blocks-spaces-in-between.html

밀도에 따라 링 중앙에 공간이 없을 수 있습니다 (구룡 참조).

블록을 완성하면 건물을 생성해야합니다. 약간 까다 롭고 2 패스 생성이 필요합니다. 그것들은 부분적으로 상호 의존적입니다. 발전기는 다음 건물 측벽 앞에 창을 만들면 안됩니다.

그리고 이것에 생명을 불어 넣기 위해 지형이나 경제지도와 같은 환경으로 세대에 영향을 줄 수 있습니다. (샌프란시스코 제외) 도로는 직진하지 않고 큰 언덕을 돌아 다니는 경향이 있으며 주택 유형은 무겁습니다. 그들이있는 도시의 일부에 영향을받습니다.

재밌게

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.