절차… 방 발전기가있는 집


74

절차 적으로 던전을 생성하는 방법에 대한 알고리즘과 기사를 살펴 보았습니다 . 문제는 방이있는 집을 만들려고하는데 내 요구 사항에 맞지 않는 것 같습니다.

우선 지하 감옥에는 복도가 있고 집에는 복도가 있습니다. 복도는 처음에는 똑같아 보일 수 있지만 복도는 방이 아닌 공간에 지나지 않지만 복도는 특정 영역을 다른 영역에 연결하도록 특별히 설계되었습니다.

집과의 또 다른 중요한 차이점은 특정 너비와 높이가 있고 모든 것을 방과 복도로 채워야하지만 던전에는 빈 공간이 있다는 것입니다.

집의 홀은 던전 복도 (다른 방으로 데려다 줄 것)와 던전의 빈 공간 (코드에는 명시 적으로 정의되어 있지 않음) 사이에 있다고 생각합니다.

보다 구체적으로 요구 사항은 다음과 같습니다.


  • 벽과 문을 즉석에서 작성할 수없는 사전 정의 된 방 세트가 있습니다.
  • 룸은 회전 할 수 있지만 크기를 조정할 수는 없습니다
    . 사전 정의 된 룸 세트가 있으므로 크기를 조정하지 않고 회전 만 할 수 있습니다.
  • 집 크기가 설정되어 있고 방 (또는 홀)으로 완전히 채워 져야합니다.
    즉, 빈 공간이 없도록 사용 가능한 방으로 14x20 집을 채우고 싶습니다.

좀 더 명확하게하기위한 몇 가지 이미지는 다음과 같습니다.

일반적인 던전 생성기 복도가없는 던전 주택 발전기 결과

보시다시피, 집에서 "빈 공간"은 여전히 ​​걸어 갈 수 있으며 한 방에서 다른 방으로 이동합니다.

그래서,이 모든 것을 말했듯이, 아마도 집은 복도가있는 정말 꽉 채워진 던전 일 것입니다. 아니면 던전보다 쉬운 일입니다. 어쩌면 거기에 무언가가 있는데, 실제로 무엇을 검색 해야할지 모르기 때문에 찾지 못했습니다.

이것이 내가 당신의 도움을 원하는 곳입니다. 이 알고리즘을 설계하는 방법에 대한 포인터를 제공해 주시겠습니까? 어떤 단계를 밟을 생각이 있습니까? 던전 생성기를 만든 경우 내 요구 사항에 맞게 수정하려면 어떻게해야합니까? 원하는만큼 구체적이거나 일반적 일 수 있습니다. 정말 당신의 두뇌를 고르려고합니다.


2
이상한 추천 : 나는 크리스토퍼 알렉산더의 저서 'Timeless Way Of Building and A Pattern Language' , (소프트웨어) 패턴의 개념에 대한 기초를 형성 한 건축 서적을 확인하는 것이 좋습니다 . 그것들은 본질적으로 하향식 절차 적 구성 방법으로 전환 될 수있는 건물과 생활 공간에 대한 명시 적 언어를 기술합니다.
Steven Stadnicki

개인적으로 나는 egarcias의 대답과 같은 알고리즘을 만들려고합니다. 룸 플레이스 홀더 (다양한 룸 수로 채워질 수있는 넓은 영역)를 생성하는 것으로 시작하십시오. 각 룸 플레이스 홀더는 그들 사이에 특정 (또는 하한이있는 임의의) 크기 간격을 가져야합니다. 복도, 즉 집 안에 있지만 방에는없는 공간으로 간주되며, 방 자리 표시자는 '복도없는 지하 감옥'예와 비슷한 임의의 크기의 방으로 채워집니다.
Benjamin Danger Johnson

@pek 솔루션에 대한 답변을 작성하십시오. 질문에 넣지 마십시오.
MichaelHouse

@ Byte56 완료. 분명히, 나는 다른 사람들이 제안한 것만으로 신용을 얻고 싶지 않기 때문에 그렇게했습니다. 왜 이것이 사이트 형식에 적합하지 않은지 이해하므로 답변을 추가했습니다.
pek

감사합니다 @pek. 신용을 얻는 것에 대해 걱정할 필요가 없으며, 가치가 있으며, 솔루션을보기 위해 사이트를 방문하는 사람들에게 유용합니다.
MichaelHouse

답변:


50

이진 또는 삼진 공간 파티션을 사용하는 것이 좋은 경우라고 생각합니다.

첫 번째 패스에서 집 공간을 홀과 {방 블록}으로 나눕니다. 다음 큰 덩어리를 가져 와서 {hall and chunk} 또는 {2 chunks와 그들 사이에 홀}로 나누십시오. 모든 단계에서 슬라이싱 방향을 90도 회전시킵니다. {더 큰 덩어리가 남지 않음} 또는 {총 홀 면적이 한도에 도달하면 중지}.

두 번째 패스에서 나머지 청크를 방으로 나눕니다. 다음 큰 덩어리를 가져 와서 나누십시오. 큰 방을 갖기 위해 크지 않은 덩어리를 무작위로 나누지 마십시오.

홀이 훨씬 오래된 홀을 향하고있는 경우 벽 (또는 문이있는 벽)을 배치하십시오.

홀이있는 방을 직접 연결하거나 이미 연결된 다른 방을 통해 연결하십시오.

예를 들어, 수동으로 제작 한 결과 또는 C ++와 비슷한 부분 유사 유사 코드를 볼 수 있습니다. 최종 샷 :

최종 샷


그것은 공간 분할에 대한 나의 연구 결과입니다. 코드가있는 예제는 나에게 아주 좋은 시작을 주었다. 나는 현재 알고리즘을 읽고 있습니다. 하나의 질문 : 내 요구 사항 중 하나는 방이 미리 정의되어 있다는 것입니다 (즉, 하나의 문이있는 2x2 방, 두 개의 문이있는 1x1이지만 세 개의 문이있는 2x2는 없음). 파티션을 시작할 수 없으며 문을 배치 할 위치를 결정합니다 . 나는 파티션을 나누는 동안 내 한계를 명심해야한다고 생각합니다. 내가 어떻게 할 건지 제안 해? 어쨌든 귀하의 답변과 노력에 감사드립니다!
pek

@pek 필사자 만이이 문제에 대한 학문적 해결책을 찾을 수 있는지 잘 모르겠습니다. 청크 스플리터 및 박스 스플리터에 대한 추가 조건을 설정 한 다음 모든 조건을 충족 할 수있는 레벨을 찾을 때까지 레벨을 생성 및 제거 할 수 있습니다.
Shadows In Rain

그래, 뭔가 빠졌 으면 좋겠다. 첫 번째 접근 방식은 A *를 사용하여 주어진 공간에 방을 맞추는 방법을 알아내는 것이었지만 홀의 논리가 부족했습니다. 이제 BSP를 사용하여 홀을 배치 한 다음 A *를 블록에 사용할 수 있다고 생각합니다. 내가 가장 걱정하는 것은 너무 비싸고 항상 결과를 생성하지는 않는다는 것입니다. 그러나 먼저 이것을 테스트해야합니다. 아마 나쁘지 않을까요?
pek

2
@pek 여전히 관심이 있다면 유용한 것을 발견했습니다. 봐 ,이 또한 구글, L-system.
Shadows In Rain

24

원하는 디자인이 복도로 둘러싸인 직사각형 방에 방을 집중 시킨다는 사실을 활용할 수 있습니다. 그것을 염두에두고, 나는 이것을 할 것입니다 :

  1. 복도를위한 공간과 "큰 공간"설계
  2. 각 "큰 공간"을 방으로 채우십시오

2 단계

경계에서 방으로 시작하면 넓은 공간을 방으로 채울 수 있습니다. 복도를 향한 방은 그 벽에 문을 가질 수 있지만 "외부 벽"을 향하는 방은 특정 ​​제약 조건이 있습니다. 할 수 없습니다 (아마도 창문을 가질 수 있음). 방의 큰 블록의 "내부"에는 적어도 하나의 출입구가 필요합니다.


15

그래서이 문제를 해결하는 방법은 다음과 같습니다. 그러나 먼저 @Shadows In Rain과 @egarcia 모두 답변을 주셔서 감사합니다. 그들은 나에게 좋은 결과를 주었다.

Shadows In Rain의 공간 분할을 사용하여 기본 주택을 생성 한 다음 egarcia의 조언에 따라 해당 공간을 방으로 채 웁니다.

코드의 90 %가 Shadows에 의해 수행 된 이후 공간 분할은 매우 간단했습니다. "객실 채우기"부분은 조금 더 어려웠습니다. 나는 A *를 사용하여 방을 적절하게 배치하는 의사 AI 계획 시스템을 사용하기로 결정했습니다. A * 대신 계획을 사용하는 것이 좋은 점은 전제 조건이 검색 공간을 크게 줄이는 데 도움이된다는 것입니다.

다음은 결과가 포함 된 스크린 샷입니다.

평면도 생성 단계 평면도 생성 단계

방 배치 단계 방 배치 단계

이제 연결 문으로!
이제 연결 문으로!


11

Dahl & Rinde는 실내절차로 건물 내부를 채우기 위해 골격 및 지역 접근 방식을 사용하는 실내 환경의 절차 생성에 관한 논문 을 보유하고 있습니다. 이 논문에는 프로토 타입에 대한 클래스 다이어그램이 포함되어 있습니다. 앞서 언급 한 A Pattern Language를 포함하여 참고 문헌에 좋은 참고 자료가 있습니다.

그들의 작업은 다음과 같은 간단한 가정을 중심으로 설계되었습니다.

  • 아파트 건물 만 취급
  • 분할 레벨 없음
  • 건물 (봉투)의 모양을 제한하는 것은 다각형이어야합니다
  • 봉투에 구멍이 없다
  • 비슷하거나 선형으로 변화하는 봉투 두께 (IE 모래 시계 모양 없음)
  • 복도가 필요한 건물 만 취급

프로세스에 대한 간략한 개요는 다음과 같습니다.

  • 봉투 의 골격 을 찾으 십시오. 그런 다음 복도에서 봉투, 문 또는 계단과의 거리 및 이전에 배치 된 복도와의 거리에 따라 골격을 따라 배치됩니다.
  • 다음으로, 나머지 비복도 공간은 각각 단일 연속 경계를 갖는 최대 연결 영역으로 분할됩니다. 경우에 따라서는 벽을 삽입해야합니다.
  • 그런 다음이 지역은 아파트 당 하나 이상의 창을 할당하려는 아파트로 나뉩니다. 경우에 따라 소규모 아파트가 합병되어 지나치게 작은 아파트를 피할 수 있습니다. 창이없는 지역은 단순히 무시됩니다.
  • 마지막으로 아파트는 다음과 같이 가중 Voronoi와 같은 다이어그램을 사용하여 방으로 나뉩니다.

    • 종자 무게는 방 크기에 영향을 미치기 위해 사용됩니다. 씨앗은 문과 창문에 추가됩니다. 일반적으로 원하는 방마다 하나씩 추가 종자가 추가됩니다. 명시 적으로 언급되지는 않지만 씨앗이 아파트의 외벽을 따라 배치 된 것처럼 보입니다.
    • 가장 먼 지점부터 시작하여 주어진 시드와 다른 모든 지점 사이의 선이 계산 된 다음 종점의 각 가중치에 대한 거리를 이등분합니다 (EG의 가중치가 1과 4 인 경우 EG). A에서 B까지의 1/4). 외부 벽과 함께 이등분 선의 수집은 씨앗의 세포를 형성합니다.
    • 다음으로, S-Space 벽 골격 (Peponis et al 1997에 따름)은 인접한 외벽 피처 쌍 (창 또는 문) 사이의 중간 지점에서 수직으로 시작되는 선으로 영역을 분할하여 생성됩니다.
    • 마지막으로, 벽은 '보로 노이 셀 벽에 가능한 한 대응하는'S- 공간 골격에서 선택됩니다.

3
사진을 포함시킬 수 있습니까? 대단 할 것입니다. 나는 종이를 훑어 보았고 그들이 만든 방은 건축 POV에서 좋아 보였다.
congusbongus

매우 흥미로운 방법, 나는 그것을 제거 할 수있는 아이디어에 대해 더 자세히 조사해야합니다.
Draco18s

나는 직장에서 휴식을 취하기 위해 여기에왔다 ... 놀랍게도 나의 연구 주제가 나온다. 나는 나 자신의 연구 (아직 알고리즘의 핵심만을 설계 했으므로 가치가 없다) 또는 Danil Nagy의 문제에 대한 접근 방식을 설명하기에 너무 답답하다. autodeskresearch.com/publications/…
Felipe Gutierrez
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.