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.