서로 다른 높이의 인접 타일로 타일 맵 / 지형 구현


10

어이!

타일 ​​맵에 대한 정보 또는 특정 유형의 타일 맵이 무엇인지 찾고 있습니다.

나는 롤러 코스터 타이쿤 또는 운송 타이쿤 시리즈 게임에 사용되는 구현에 관심이 있으며 벡터 필드 지형 및 높이지도 지형을 조사하고 있지만 내가 원하는 것에 적합하지는 않습니다. 나타나게 하다.

대부분의 사람들이 정보를 등각 타일 맵이라고 부르면서 적절한 정보를 찾기가 어려웠지만 고정 된 직교 관점으로 3D로 무언가를 만들려고합니다. 타일 ​​맵의 기본 저장소는 렌더링 방법과 아무 관련이 없지만 구식 포켓몬 / 젤다 게임과 같은 2D 타일 맵을 만드는 것은 아닙니다. 돌출 절벽과 경 사진 지형.

방금 진행할 경로를 결정하는 데 도움이되는 리소스를 검색하기 위해 Google과 stackoverflow를 검색하는 올바른 용어를 찾으려고합니다.

지금까지 VBO에 저장된 height / y 구성 요소를 사용하지 않고 기본 타일 맵을 플레어 아웃하여 와이어 프레임으로 렌더링했습니다. 지금까지는 괜찮아 보이지만 인접한 타일에 영향을 미치지 않고 단일 정점을 조작하여 절벽과 경사를 만들려고 할 때 문제가 발생할 것으로 예상합니다.

조사해야 할 특정 유형의 구현이 있습니까? 벡터 필드 지형에 대한 정보가 있으면 공정한 금액을 찾았을 때 금이 갔다고 생각했지만 이것이 올바른 결과를 가져올 지 확신하지 못합니다.

누군가 나를 위해 이것에 대해 약간의 빛을 비출 수 있다면, 도움이 크게 감사하겠습니다 :)

최신 정보

달성하고자하는 것에 대한 추가 설명을 위해 이미지를 포함 시켰습니다.

2.5D 타일 맵

기울어 진 (높이) 등각 타일을 만드는 방법 에서 가져온 이미지

이 이미지는 생성하고자하는 지형의 유형을 보여 주지만 모델링에 관심이있는 "절벽"또는 돌출 된 지형 유형은 포함하지 않습니다. 그러나 내가 고려하지 않은 몇 가지 다른 질문, 즉;

  • 물 (이미지의 왼쪽 상단)과 같은 '레이어'는 어떻게 물 아래에 보이는 땅을 포함하도록 처리됩니까?
  • 지구의 진흙이 세상을 평평하지 않은 개체로 묘사하도록지도의 "가장자리"를 어떻게 수용 할 수 있을까요?
  • 이러한 종류의 지형에 대한 기본 저장소를 사용하여 언덕을 굴러 내리는 공이나 경사를 통과하는 플레이어의 이동 속도와 같은 물리를 모델링 할 수 있습니까?

지형의 각 타일은 8 개의 정점으로 모델링 될 수 있고 4 개의 주요 정점이 실제 타일 자체를 덮고 나머지 4 개의 정점이 각 타일의 측면 / 벽을 모델링하는 데 사용된다는 아이디어가있었습니다. 이 구현에서 볼 수있는 두 가지 문제는 a) 세계지도의 크기가 본질적으로 두 배가되고 b) 모든 타일에 "벽"이 포함되지 않을 경우 일부 타일은 사용되지 않는 중복 정점으로 끝나는 것입니다.

게임 플레이 중에 지형을 변경하는 기능을 포함하여 각 타일을 변형시킬 수있는 지형 편집기를 만들고 싶습니다. 이것 자체는 다음과 같은 추가 질문을 제기합니다. VBO를 사용하여 지형을 저장하고 렌더링하는 동안 즉시 수정하고 주변 타일에 영향을주지 않고 정점을 수정할 수 있습니까?

나는 내가 원하는 것을 달성하는 방법에 대한 명확한 아이디어없이 문제를 해결하기 위해 코드를 작성하는 것을 무시하고 있다는 것을 지나치게 복잡하게 만들거나 분석 마비에 빠졌다는 인상을 받고 있습니다.

다시, 나는 정말로 이것으로 올바른 방향으로 밀기를 찾고 있습니다. 3D 맵이 맵 에디터와 게임 플레이 모두에 의해 변형 될 수있는 특정 유형의 타일 맵 / 지형 구현이 있습니까? 아니면 직접 말해야합니다. 나는 바퀴를 재발 명하려고하지 않지만 무엇을 검색 해야할지 확실하지 않은 경우 리소스를 찾기 위해 고심하고 있습니다.

누구나 정보, 리소스 또는 코드 스 니펫을 제공 할 수 있다면 내 손을 더럽 히고 현재 가지고있는 플랫 와이어 프레임 이외의 것을 생산하기를 열망하므로 대단히 감사하겠습니다.

읽어 주셔서 감사합니다!

답변:


2

내가 당신이라면 복셀, 특히 Minecraft 형 큐브 렌더링을 살펴볼 것 입니다. 하이트 맵과 달리 오버행, 동굴, 여러 층의 건물 등을 처리 할 수 ​​있습니다.

3D 정수 배열에 터 레인을 저장합니다. 여기서 숫자는 특정 유형의 터 레인에 매핑됩니다 : 0 = air, 1 = dirt, 2 = water 등. 그런 다음 렌더링 할 메시를 만들려면 비어 있지 않은 복셀마다 큐브의면을 만듭니다.

이 튜토리얼 은 Ogre3D를 사용하여 C ++에서이를 수행하는 방법에 대한 훌륭한 설명입니다. OpenGL에서 조금 더 저수준으로 가야한다고 가정합니다.

큐브를 만든 후에는 가장자리를 부드럽게하여 이미지에 표시되는 유체 지형의 종류를 만들려고합니다. PolyVox (C ++에서도) 가이 작업을 수행 한다고 생각 합니다. 그들의 코드를 살펴볼 수 있습니다. 기본적으로 이미지가 2D로 표시되는 것을 3D로 수행한다고 생각합니다. 각 정점을 배치 할 위치를 알기 위해 주변 큐브 위치를 평균화합니다.

편집하다:

  • 워터 타일이 비어있는 것처럼 물에 인접한 큐브의면을 생성하고 수면을 투명하게 만듭니다.
  • 세계 바깥의 복셀이 비어 있다고 생각하면 "가장자리"의 얼굴을 일반 얼굴처럼 생성 할 수 있습니다.
  • 물리 : 렌더링 된 메시를 물리 엔진에 정적 객체로 공급할 수 있습니다.
  • 맵 에디터 : 메시 자체가 아닌 기본 복셀 데이터를 편집하고 싶습니다! 메시는 데이터를 미러링해야하므로 복셀을 편집하면 메시에 변화가 생깁니다. 익숙하지 않은 모델, 뷰, 컨트롤러 (MVC)를 찾아 볼 수 있습니다.

더 궁금한 점이 있으면 언제든지 의견을 남겨주십시오. gamedev.SE에 오신 것을 환영합니다!


이것은 비교적 간단한 문제에 대한 매우 복잡한 솔루션입니다. 복셀의 복잡성없이 OP가 요구하는 것을 많은 게임이 해냈습니다.
Sean Middleditch

복셀이 복잡 할 수 있다는 데 동의합니다. 이 게임들에 연결 하시겠습니까? 그들이 어떻게했는지 듣고 싶습니다.
Wackidev

복셀을 사용한다는 아이디어로 놀았습니다. 이 구현은 모든 큐브가 단위 치수이거나 단일 큐브가 압출 될 수 있음을 의미합니까? 나는 y 평면을 따라 "오버랩"될 수있는 물과 다른 타일을 허용하기 위해 세계가 층으로 저장 될 필요가 있다고 생각합니다.
CaptainRedmuff

예, 일반적으로 복셀의 크기는 단위입니다. 나는 그것들을 압출 할 수 있다고 생각하지만, 그것이 더 복잡해질 것이라고 생각합니다. 레이어의 의미를 이해하고 있는지 잘 모르겠습니다. 높이가 가변적 인 수조를 언급하고 있습니까?
Wackidev

그 라인을 따라 뭔가. 나는 단순히 두 개의 교차하는 평면에 의해 정의 된 워터 큐브를 갖는 압출 큐브 일 수있는 "바닥"을 정의하는 것에 대해 더 많이 생각하고있었습니다. 어쩌면 나는 다시 일을 복잡하게하고 있습니다. 복셀에 대해 좀 더 읽어보고 그것이 나를 이끌어주는 곳을 보겠습니다.
CaptainRedmuff

6

이것은 : http://30.media.tumblr.com/tumblr_m06qv6OREt1r2qjpao1_500.png 는 얼마 전에 내가 한지도 의 예입니다.

지도와 다른 유형의 타일을 나타내는 XML이 있습니다. 각 유형에는 몇 가지 속성이 있습니다.

  • 신장
  • 위치
  • 병합 유형 :이 타일이 ALL어떤 타일과 병합되는지 ( 타일과 병합 해야하는 경우), EQUAL동일한 유형의 타일과 병합 만) NONE(절대 병합하지 않음).
  • 높이 병합 : 경사면의 최대 높이 (오버행에 적합), 타일을 같은 높이 또는 1의 차이로 타일과 병합하려는 경우 값은 1이됩니다.

그런 다음 모든 타일을 읽고 장면에서 만듭니다. 먼저 위치 만 고려하십시오. 각 타일은 이웃을 알아야 했으므로 맵을 두 번 통과하고 한 번만 모든 것을 만들고 각 정점을 올바른 위치로 이동해야했습니다.

내 모델은 육각형이지만 개념은 동일하지만 타일을 나타 내기 위해 큐브가 필요합니다. 그런 다음 기본 정점을 가장 낮은 수준으로 이동하고 큐브의 주위에 큐브가있는 큐브의 상단을 '부드럽게'합니다. 또한 큐브의 양면이 병합되었는지 확인하여 큐브에서 해당 측면을 제거 할 수 있습니다 (병합되지 않은 경우 절벽 또는 무언가 일 수 있음).

물리학은 목표에 달려 있습니다. rollercoaster tycoon과 같은 일을하는 경우 실제로 필요하지 않습니다. 각 타일 사이의 플레이어 높이를 확인하고 보행 속도를 결정할 수 있습니다. 공과 같이 스스로 움직이는 물체에 대해서도 똑같이 할 수 있으며 주변 타일 (또는 현재 타일 각도)을 확인하고 방향 / 속도를 결정할 수 있습니다. 실제 물리 (중력, 마찰 등)가 필요한 경우 물리 엔진을 사용해야하며 엔진에서 큐브 3D 표현을 사용할 수 있습니다.

레이어도 가능하지만 마인 크래프트와 같은 것이 필요합니다 (가장 높은 레이어의 큐브를 부드럽게 함). 물에 레이어 만 필요한 경우 타일에 "물 스프링"을 설치하고 코드의 높이나 높이가 같은 주변의 모든 공간을 채울 수 있습니다 (재귀 솔루션은 여기에 잘 맞습니다).

코드가 충분히 융통성있는 경우 터 레인 편집기도 간단합니다. 단일 타일 (변경중인 타일) 또는 타일 목록 ( '브러시'를 사용하는 경우)에 변형을 적용 할 수 있습니다. 선택하고 이동하십시오). 동일한 코드를 사용하여 게임의 지형을 수정할 수 있습니다. 그리고 예, VBO의 정점을 변경할 수 있습니다. 다른 것에 영향을 미치지 않고 정점을 변경할 수도 있습니다 (또한 코딩에 따라 다릅니다).


+1 입력 해 주셔서 감사합니다. 이전에 고려하지 않은 "물 스프링"과 관련하여 레이어링에 대해 좋은 지적을합니다. 나는 그것이 가능하다는 것을 알았으므로 즉시 VBO를 수정하는 방법을 살펴볼 것입니다 :)
CaptainRedmuff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.