hmm 은 H 8 M AP Meshing 유틸리티입니다.
3D 게임 개발, 3D 프린팅 또는 기타 작업을 수행 한 경우 Grayscale Heightmap 이미지를 3D 메시로 변환하고 싶었을 것입니다. 순진한 방법은 매우 간단하지만 수백만 개의 삼각형으로 거대한 메쉬를 생성합니다. 수년에 걸쳐 다양한 솔루션을 해킹 한 후 마침내이 목적을 위해 좋은 도구를 작성해야한다고 결정했습니다.
hmm Garland와 Heckbert의 지형과 높이 필드의 1995 년 종이 빠른 다각형 근사의 멋진 알고리즘의 현대적인 구현입니다. hmm 에 의해 생성 된 메시는 Delaunay 조건을 충족시키고 지정된 최대 오차 또는 최대 삼각형 또는 정점 수를 만족시킬 수 있습니다. 또한 매우 빠릅니다.
brew install glm # on macOS
sudo apt-get install libglm-dev # on Ubuntu / Debian
git clone https://github.com/fogleman/hmm.git
cd hmm
make
make install heightmap meshing utility
usage: hmm --zscale=float [options] ... infile outfile.stl
options:
-z, --zscale z scale relative to x & y (float)
-x, --zexagg z exaggeration (float [=1])
-e, --error maximum triangulation error (float [=0.001])
-t, --triangles maximum number of triangles (int [=0])
-p, --points maximum number of vertices (int [=0])
-b, --base solid base height (float [=0])
--level auto level input to full grayscale range
--invert invert heightmap
--blur gaussian blur sigma (int [=0])
--gamma gamma curve exponent (float [=0])
--border-size border size in pixels (int [=0])
--border-height border z height (float [=1])
--normal-map path to write normal map png (string [=])
--shade-path path to write hillshade png (string [=])
--shade-alt hillshade light altitude (float [=45])
--shade-az hillshade light azimuth (float [=0])
-q, --quiet suppress console output
-?, --help print this message
hmm 입력 높이 맵의 PNG, JPG 등과 같은 다양한 파일 형식을 지원합니다. 출력은 항상 바이너리 STL 파일입니다. 다른 필요한 매개 변수는 -z 입니다. 이는 출력 메쉬에서 z 축을 얼마나 많이 확장할지 지정합니다.
$ hmm input.png output.stl -z ZSCALE최대 허용 오류, 삼각형 수 또는 정점 수를 제공 할 수도 있습니다. (다중 지정이 지정되면 첫 번째에 도달 한 것이 사용됩니다.)
$ hmm input.png output.stl -z 100 -e 0.001 -t 1000000아래 이미지를 클릭하여 다양한 명령 줄 인수의 예를 보려면. 이 예제를이 높이 맵으로 직접 시도해 볼 수 있습니다 : gale.png.
필수 -z 매개 변수는 수직 z 축에서 완전히 검은 색 픽셀과 완전 흰색 픽셀 사이의 거리를 정의하며, 단위는 하나의 픽셀 너비 또는 높이와 같습니다. 예를 들어, 높이 맵의 각 픽셀이 1x1 미터 정사각형 면적을 나타내고 높이 맵의 수직 범위가 100 미터 인 경우 -z 100 사용해야합니다.
-x 파라미터는 단순히 제공된 z 스케일 위에 추가 승수입니다. Z 스케일은 종종 실제 데이터에서 파생되며 142.2378과 같은 이상한 값을 가질 수 있기 때문에 편의성으로 제공되므로 z 스케일은 종종 2x에 의해 과장하기 위해 머리에 곱하기를 할 필요가 없습니다.
-e 매개 변수는 출력 메쉬의 최대 허용 오차를 총 메시 높이의 백분율로 정의합니다. 예를 들어, -e 0.01 사용하면 완전 검은 픽셀과 완전 흰색 픽셀 사이의 거리의 1% 이상의 오류가 없습니다. 이는 8 비트 입력 이미지의 경우 e = 1 / 256 ~= 0.0039 의 오류가 하나의 전체 회색체 단위보다 큰 오류가 없는지 확인합니다. ( 0.5 / 256 과 같은 낮은 값을 사용하는 것이 여전히 바람직 할 수 있습니다.)
-b 옵션이 고체 메쉬를 생성하는 데 사용되면 HeightMesh의 가장 낮은 부분이 HeightMap의 높이의 백분율로 기본의 높이를 정의합니다. 예를 들어, -z 100 -b 0.5 사용된다면, 최종 메쉬는 키가 약 150 단위 일 것이다 (완전 흰색 픽셀이 입력에 존재하는 경우).
--border-size 및 --border-height 플래그와 함께 메쉬에 테두리를 추가 할 수 있습니다. 높이 맵은 삼각 분리 전에 border-size 픽셀로 패딩됩니다. 테두리의 (사전 스케일 된) z 값은 기본값으로 1로 기본적으로 border-height 로 설정할 수 있습니다.
가우스 블러는 --blur 플래그와 함께 적용 할 수 있습니다. 이것은 시끄러운 이미지에 특히 유용합니다.
--invert 플래그로 높이 맵을 반전시킬 수 있습니다. 이것은 리토판에 유용합니다.
높이 맵은 --level 플래그로 자동 레벨을 유지할 수 있습니다. 이렇게하면 회색체 값이 늘어서 전체 검은 색 => 화이트 범위를 사용합니다.
감마 곡선을 --gamma 플래그로 높이 맵에 적용 할 수 있습니다. 이것은 각 픽셀에 x = x ^ gamma 적용하며 여기서 x [0, 1]에 있습니다.
--normal-map 인수로 전체 해상도 정상 맵을 생성 할 수 있습니다. 이렇게하면 정상적인 맵을 지정된 경로에 RGB PNG로 저장합니다. 이는 하위 해상도 삼각형 메쉬를 사용하면서 더 높은 해상도 범프 및 세부 사항을 렌더링하는 데 유용합니다.
그레이 스케일 언덕 쉐이드 이미지는 --shade-path 인수로 생성 될 수 있습니다. 광원의 고도와 방위각은 --shade-alt 및 --shade-az 인수로 변경 될 수 있으며,이 인수는 기본적으로 45도, 북쪽에서 0도 (UP)로 0도까지 변경 될 수 있습니다.
성능은 HeightMap의 세부량에 따라 크지 만, 에베레스트 산을 중심으로 한 40x40 킬로미터의 예제 높이 맵에 대한 수치는 다음과 같습니다. 다양한 높이 맵 해상도 및 허용 된 최대 오류가 표시됩니다. Times는 2018 13 "MacBook Pro (2.7 GHz Intel Core i7)에서 계산되었습니다.
| 이미지 크기 / 오류 | e = 0.01 | e = 0.001 | E = 0.0005 | e = 0.0001 |
|---|---|---|---|---|
| 9490 x 9490 px (90.0 MP) | 6.535 | 13.102 | 19.394 | 58.949 |
| 4745 x 4745 px (22.5 mp) | 1.867 | 4.903 | 8.886 | 33.327 |
| 2373 x 2373 PX (5.6 MP) | 0.559 | 2.353 | 4.930 | 14.243 |
| 1187 x 1187 px (1.4 MP) | 0.168 | 1.021 | 1.961 | 3.709 |
| 이미지 크기 / 오류 | e = 0.01 | e = 0.001 | E = 0.0005 | e = 0.0001 |
|---|---|---|---|---|
| 9490 x 9490 px (90.0 MP) | 33,869 | 1,084,972 | 2,467,831 | 14,488,022 |
| 4745 x 4745 px (22.5 mp) | 33,148 | 1,032,263 | 2,323,772 | 11,719,491 |
| 2373 x 2373 PX (5.6 MP) | 31,724 | 935,787 | 1,979,227 | 6,561,070 |
| 1187 x 1187 px (1.4 MP) | 27,275 | 629,352 | 1,160,079 | 2,347,713 |