복셀 지형 엔진은 어떻게 만들어 집니까?


53

며칠 전에 복셀 지형이라는 것을 발견했는데 꽤 멋지다고 생각합니다. 그러나 나는 그것들을 생성하는 것을 모른다. 모델링 소프트웨어에서 모델링하거나 하이트 맵과 같은 것을 사용합니까? 나는 위키 백과 에서 복셀이 3D 픽셀이나 체적 픽셀과 같다는 것을 읽었습니다 .

복셀 지형을 만든 후에 어떻게이 복셀을 가져 와서 파괴 / 파기 할 수 있습니까?


다음을 기반으로 최고의 답변을 선택합니다.

  1. 코드와 알고리즘. 가급적 C # 기반
  2. 설명. 저는 알고리즘 초보자이지만 객체 지향 프로그래밍에 매우 익숙합니다.
  3. 단계별 데모. 개념뿐만 아니라 방향.
  4. 다이어그램 / 일러스트. 아니요, 다른 엔진의 스크린 샷이 아닙니다.


나는 이것이 복잡한 주제라는 것을 안다. 그러나 도움을 주셔서 감사합니다!

아니요, 마인 크래프트 클론을 만들려고하지 않습니다.


편집하다

큰 도움을 주신 모든 분들께 감사드립니다 (특히 Nick Wiggill)! 이것이 내가 관리 한 것입니다 (작업 진행 중).


[유니티]와 C ? 그건 ... 말이 안됩니다.
Martin Sojka

C를 이해합니다
Daniel Pendergast

8
당신은 그러한 대담한 요청으로 공동체에 대해 많은 믿음을 가지고 있습니다. FPS가 좋은 오늘날의 하드웨어를위한 완전 역동적 인 복셀 지형에 관한 완벽한 논문입니다. 글쎄, 주제가 너무 광범위하고 어려워서, 나는 당신이 일반적인 해결책을 보게 될 것 같지 않다. 그러나 누가 알 느냐에 따라 역할 모델에 따라 가능할 수도 있습니다. 당신이 하시겠습니까 크라이시스 2 복셀 지형 또는 델타 포스 하나? 어쩌면 당신은 Minecraft 클론을하고 있거나 굴착 게임을 위해 모래 시뮬레이션이 필요합니까? 범위를 정의하십시오.
EnoughTea

2
이 미들웨어를 체크 아웃 : forum.unity3d.com/threads/...를 . 특히 데모
Tetrad

1
GPU Gems 3에는 복셀 지형에 대한 장이 있습니다. http.developer.nvidia.com/GPUGems3/gpugems3_ch01.html
Tamschi

답변:


58

복셀 지형을 생성하려면

(a) 일반적인 방법은 Perlin 노이즈를 사용하여 하이트 맵을 생성하는 것입니다. 하이트 맵은 기본적으로 픽셀의 어두움 또는 밝음으로 다른 높이를 나타내는 단색 이미지입니다.

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

하이트 맵 이미지에서 해당 픽셀의 밝기에 따라이 하이트 맵의 개별 픽셀을보고 서로 다른 (x, y) 위치에서 다른 높이 (z 축)까지 복셀의 "스택"을 만듭니다. Perlin 노이즈 이미지가 매끄 럽기 때문에 (어두운 곳에서는 날카로운 가장자리가 없음) 지형이 부드럽게 굴러갑니다.

(b) 다른 다면체로 풍경을 만들어 점진적으로 구성 할 수 있습니다. 원하는 복셀 모양에 가까운 다면체 벡터 모양을 만듭니다. 3D 다면체 방법 (대부분 볼록 헐)을 사용하여 월드 그리드의 어느 지점이 해당 다면체 볼륨 내에 있는지 확인하십시오. 예를 들어, 공간에 피라미드를 정의하십시오. 피라미드 볼륨과 비교하여 월드 공간의 로컬 영역에있는 모든 지점을 확인한 후 그 지점에 속하는 지점을 알 수 있으며 해당 셀을 "현재"로 설정하여 빈 공간이 아니라 복셀이됩니다. 이제 공간에 복셀 피라미드가 있습니다. 이러한 방식으로 지형을 형성 할 때까지 모든 종류의 모양을 계속 추가 할 수 있습니다.

(c) ( b 와 동일 ) 모델링 도구를 작성하십시오. Voxatron 은 이것이 어떻게 보일지를 보여줍니다. 이것은 대체 세계 (편집자)에서 복셀 양식을 만든 다음 실제 런타임 게임 세계로 가져 오는 것입니다. Voxlap 은 복셀을위한 최초의 오픈 소스 편집기를 가지고 있다고 생각 합니다. 개별 복셀을 배치하거나 다양한 모양 / 볼륨의 복셀 "브러쉬"를 사용하여 복셀을 세상에 그릴 수 있습니다.


자신 만의 복셀 기반 게임을 구성하는 데 필요한 것

복셀 도로는 적어도 현재는 쉽지 않기 때문에이 섹션을 포함합니다. 최근에, 큰 플레이어들이 렌더링 및 물리학 응용 프로그램에 대해 복셀 엔진에 대한 많은 연구가 다시 한 번 이루어지고 있습니다.

생 복셀로부터 세계를 동적으로 구성하는 것이 세계 건설에 대한 절차 적 접근 방식이며 본질적으로 단순하지 않기 때문에 단순성 이 문제가 될 수 있습니다 . 죄송합니다. 여기에는 몇 가지 기술 용어가 있습니다. 복셀 엔진을 작성하는 것은 매우 심각한 일이며, 특히 공간 개념 측면에서 게임 엔진 개발의 여러 영역에 대한 지식이 필요합니다. 이는 3D 벡터 수학, 행렬 및 기본 미적분학을 어느 정도 합리적인 수준으로 이해하는 것을 의미합니다.

복셀 엔진이 정확히 널리 퍼져 있지 않기 때문에 "복셀 지형의 생성"에는 작동 할 컨텍스트가 필요합니다. 복셀 엔진의 작동 방식에 대한 기본 설명을 진행합니다.

복셀은 세계의 기본 빌딩 블록입니다. 이들의 위치는 (벡터 기반 3D 게임에서 사용되는) 연속 부동 소수점 공간이 아닌 정수 인덱스 3D 그리드 (배열)로 정의됩니다. 이것들은 당신의 세상의 "원자"가 될 것입니다. 그것들은 Minecraft와 같은 게임에서와 같이 3 피트가 될 수도 있고, 분자처럼 조금 더 많은 수로 묶이지 않으면 가상 캐릭터의 눈이 실제로 볼 수있는 것보다 작을 수 있습니다. 두 가지 종류가 있습니다 :

  • 큐빅 메쉬 기반 복셀 ( )-최신 그래픽 기술로, 단순성에 사용되며 최신 그래픽 기술과 함께 쉽게 사용할 수 있습니다. MineCrat 및 Dungeon Keeper와 같은 게임에 사용됩니다.
  • 포인트 복셀 ( example , example )-원래 복셀 각 영역은 공간에서 충돌 할 수있는 개별적인 점이지만 구형 경계 볼륨으로 둘러싸여있을 수 있습니다. 그것들은 더 간단하므로, 당신은 당신의 세계에서 더 많은 것을 가질 수 있고, 따라서 당신은 그것들을 더 작게 만들 수 있습니다. 이것은 일반적으로 유리합니다. 이것을 사용한 두 게임은 Comanche와 1990 년대 자정의 주님의 리메이크였습니다.

어느 쪽이든, 세계에서 복셀을 조작하는 방법은 다음과 같습니다.

세상에서 물체를 만들고 움직이려면 위에서 언급 한 수학적 도구가 필요합니다. 예를 들어 벽을 작성하려면 : 벡터를 사용하여 3D 공간에서 적절한 치수의 상자를 구성합니다. 행렬 수학을 사용하여 상자를 3D 세계에서 원하는 회전 및 위치로 변환합니다 (연속 벡터 공간에서). 복셀 엔진의 경우 추가 단계는 이제 3D 다면체 알고리즘을 사용하여 회전 된 공간에 어떤 복셀이 들어가는 지 결정하는 것입니다.

본질적으로, 이것은 당신이 세상에서 대부분의 물건을 만드는 방법입니다. 그 외에도 Maya 또는 3DS Max와 같은 방식으로 캐릭터를 "모델링"하는 고유 한 도구를 작성할 수 있습니다. 그러나 점, 모서리 및면 대신 복셀을 사용하여 캐릭터를 모델링하므로 방법이 크게 다릅니다. 월드에서 이러한 객체를 회전하기로 결정한 경우 이와 유사하게 행렬 변환을 사용해야합니다.

파괴 가능한 지형은 선택한 방법에 따라 한 번에 하나의 복셀을 제거하거나 대량의 복셀에서 CSG (Constructive Solid Geometry) 작업을 사용하여 미리 정의 된 볼륨에 따라 제거 할 수 있습니다. 예를 들어, 바위를 통해 레이저 빔을 촬영하는 경우 빔이 바위를 통해 촬영되는 원통 볼륨을 사용하여 복셀을 뺄 수 있습니다. CSG는 복셀 세계를 형성하는 3D 공간 그리드를 사용하고 다른 그리드 (이 경우 레이저 빔)에 대해 기본 그리드 (이 경우 암석) 섹션의 모든 셀을 검사하는 비교적 간단한 프로세스입니다.

Vigil이 모래에 대한 그의 의견에서 암시 한 것처럼 물질적 흐름을 갖기 위해서는 유체 역학과 세포 자동화를 살펴 봐야합니다. 이것들은 본질적으로 복셀 세계이기도하다. 이것들은 최첨단 주제이며, 정의 된 복셀 엔진에는 필요하지 않으므로, 나는 이것을 당신의 연구를위한 "스텁"으로 남겨 두겠습니다.

CSG와 유체 역학은 마지막으로 최적화에 도움이됩니다. 현재 개발 복셀 엔진은 거의 독점적으로 알 수 있듯이, 다양한 해상도로 복셀 공간을 세분화하는 방법입니다 스파 스 복셀 옥트리 (SVOs)를 사용하게 이 비디오에 곧 Atomontage 엔진을 과시합니다. 하나의 방대하고 균일 한 그리드를 처리하는 데 필요한 처리 오버 헤드로 인해 octree / SVO를 사용하는 것이 최적화 선택보다 더 필요합니다. octree는 기본적으로 트리 (지향 비순환 그래프)로, 해당 노드가 나타내는 공간에 물리적 볼륨이 포함되어 있는지 여부에 따라 모든 노드에 8 개 또는 0 개의 자식 노드가 있습니다. 옥트리가 공간을 세분화하여 복셀을 형성하는 방법을 보여주는 다이어그램이 여기에 있습니다 .

내가 아는 최고의 오픈 소스 복셀 구현은 Voxelstein3D 에 사용 된 Ken Silverman의 Voxlap Engine 입니다. C ++로 작성되었으며 지형 변형을위한 CSG 작업을 구현합니다.


커뮤니티 위키 변경은 영구적이므로 되돌릴 방법이 없습니다. 답변을 삭제하고 다시 만들어야합니다 (물론 기존 투표를 희생 함)
Jesse Dorsey

meta.stackexchange.com/questions/2974/… 클레임 중재자가이를 제거 할 수 있습니다. 그래도 상황이 바뀌 었는지 모르겠다. 어느 쪽이든 찾아 주셔서 감사합니다.
엔지니어

1
다음에 조심하십시오.
Jesse Dorsey

2
전자는 엔티티가 셀에만 직접 놓일 수있는 분리 된 공간입니다. 체스 판에 완벽하게 배치 된 조각과 같이 셀 사이에 놓이거나 테두리를 겹칠 수 없습니다. 연속 공간은 대부분의 물리 엔진에서 볼 수있는 것과 같이, 즉 부동 소수점 수를 기반으로하므로 수량이 아닌 연속적입니다. 실생활에서와 마찬가지로 실체가 원하는 공간에서 임의의 위치에 앉을 수 있습니다.
엔지니어

1
텍스처링은 암시 적입니다. 메시 기반이든 아니든 실제 복셀은 각각 순수한 색상을 갖습니다. 위에서 언급 한 접근 방식은보다 사실적인 디테일을 만들고 결합 된 메시 접근 방식 (Google Unity VoxelForm)을 활성화합니다. 복셀이 미세할수록 텍스처 디테일이 미세 해집니다. 예 : 강바닥을 바위 (회색)로 모델링합니다. 이 복셀을 material = "sand"로 설정하여 표면의 x 거리 내에있는 모든 픽셀을 모래로 변환합니다. 그런 다음 모래색으로 렌더링 할 수 있습니다. 또한 이것은 물리적 인 상호 작용에 영향을 줄 수 있으므로 모래가 물에 의해 움직이거나 파기 될 수 있습니다.
엔지니어

33

흥미로운 복셀 지형을 생성하는 가장 좋은 방법은 Perlin 노이즈 밀도 맵을 사용하는 것입니다. 3D 세계의 높이를 정의하는 2D Perlin 노이즈 맵을 사용하는 대신 3D Perlin 노이즈 맵을 사용하십시오. 하단에 더 가까운 값이 더 견고하고 상단에 더 가까운 값이 공기가되도록 맵에 가중치를 부여하십시오. 이것은 세계 높이를 제공하지만 Minecraft 지형 과 비슷한 돌출부와 동굴을 허용합니다 .

돌출부가있는 세계

여기에서 떠 다니는 섬을 테스트하거나 프랙탈 노이즈를 사용하여 동굴 시스템을 추가 할 수 있습니다.

동굴 시스템을 갖춘 세계

위의 그림과 동굴 시스템 아이디어는 이 훌륭한 블로그 게시물 에서 나온 것 입니다. 여기 에서 Perlin 노이즈에 대한 모든 정보 를 얻을 수 있으며 여기에서 시작하는 데 필요한 샘플 코드가 있습니다 .


4

다른 답변은 훌륭하지만 약간 다른 접근법을 취했습니다.

모델링 도구 (3DSMAX)에서 환경을 생성하고 그로부터 스파 스 옥트리를 구축합니다. 각 입방체의 비어 있지 않은 리프 노드는 복셀입니다. 렌더 타임에 HLSL로 구현 된 레이 캐스팅을 사용하여 어느 복셀이 어떤 픽셀을 차지하는지 찾아 픽셀을 노드에 저장된 색상으로 설정합니다. 소스 모델에서 텍스처 값을 평균화하여 트리를 생성 할 때 계산했습니다.

이것은 자유롭고 가변적 인 LOD에 대한 충돌 감지, 뷰 공간 컬링 등-그리고 레이 캐스터를 제외하고-구현하기 쉬운 많은 장점을 제공합니다.

불행히도 전화로 샘플 코드를 게시하는 것은 거의 불가능합니다.


대안은 +1입니다. 합리적인 성능으로 구현하는 것이 불가능하지는 않지만 찬반 양론에 비해 찬사보다 훨씬 큽니다. 복셀 레이트 레이싱은 GPU에 큰 영향을 미칩니다. 동일한 GPU 사이클이 여러 가지 인상적인 화면 공간 효과를 적용 할 수있는 경우이를 위해 필요한 산술 및 조건은 매우 비용이 많이 듭니다. SSAO. 가장 큰 문제는 레이 캐스팅이 라디오 시티에서 볼 수있는 다중 바운스에서 가장 잘 보인다는 것입니다. 수백만 또는 수십억 개의 복셀로 구성된 장면과 각 광선 세그먼트가 바운스 및 합성에 많은 노력을 기울이는 장면에서는 실행되지 않습니다.
엔지니어

... 따라서 스 칼린 레이 캐스팅을 내 대답 (VoxLap)에서 따로 언급 한 이유는 잘 구현하기가 어렵습니다. 수직 스캔 라인 접근 방식을 사용할 수 있다면 렌더링 프로세스의 차원이 3D에서 2D로 감소했기 때문에 픽셀 당 레이트 레이싱보다 비용이 훨씬 적습니다. 기존 RTRT에서 가능한 복잡한 조명 솔루션을 배제 할 수는 있지만 방법은 여전히 ​​준비하고 있습니다.
엔지니어
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.