This is an old revision of the document!
Loading terrain
Gorilla3D provides a simple terrain component for generation from height-map image. Besides the default usage, different procedural builders are available: diamond square, mandelbrot, perlin-noise (linear, cosine and cubic), plateau algorithms. The resolution / number of vertices is configurable.
For detailed information about the component and its methods, check out: Gorilla.Terrain
Creating a terrain at runtime from heightmap
- Form1.pas
uses Gorilla.Terrain, Gorilla.Material.Lambert; procedure TForm1.FormCreate(Sender: TObject); var LTexturePath : String; begin LTexturePath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))); FTerrain := TGorillaTerrain.Create(fGorilla); FTerrain.Parent := FGorillaViewport; // set resolution of terrain to 256 x 256 sections // this generates 65.536 cells with 131.072 triangles and 393.216 vertices. FTerrain.ResolutionX := 256; FTerrain.ResolutionY := 256; // here we load the height map image FTerrain.HeightMap.LoadFromFile(LTexturePath + 'terrain-h.jpg'); // adjust terrain size and scaling FTerrain.HeightScale := 10; FTerrain.Scale.X := 100; FTerrain.Scale.Y := 10; FTerrain.Scale.Z := 100; // build terrain mesh from previously loaded heightmap // 1st param: static buffering for large number of vertices. // 2nd param: decimation disabled FTerrain.RebuildTerrain(true, false); // apply a material as texture to it FTerrainMaterial := TGorillaLambertMaterial.Create(FTerrain); FTerrainMaterial.Parent := FTerrain; FTerrainMaterial.Texture.LoadFromFile(LTexturePath + 'terrain-c.jpg'); FTerrain.Mesh.MaterialSource := FTerrainMaterial; end;
Creating a terrain at runtime by procedural method
- Form1.pas
uses Gorilla.Terrain, Gorilla.Material.Lambert; procedure TForm1.FormCreate(Sender: TObject); var LTexturePath : String; begin LTexturePath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))); FTerrain := TGorillaTerrain.Create(fGorilla); FTerrain.Parent := FGorillaViewport; // set resolution of terrain to 256 x 256 sections // this generates 65.536 cells with 131.072 triangles and 393.216 vertices. FTerrain.ResolutionX := 256; FTerrain.ResolutionY := 256; // adjust terrain size and scaling FTerrain.HeightScale := 10; FTerrain.Scale.X := 100; FTerrain.Scale.Y := 10; FTerrain.Scale.Z := 100; // build a random terrain by a predefined procedural algorithm FTerrain.RandomTerrain(TRandomTerrainAlgorithmType.DiamondSquare); // apply a material as texture to it FTerrainMaterial := TGorillaLambertMaterial.Create(FTerrain); FTerrainMaterial.Parent := FTerrain; FTerrainMaterial.Texture.LoadFromFile(LTexturePath + 'terrain-c.jpg'); FTerrain.Mesh.MaterialSource := FTerrainMaterial; end;
NOTICE: Once you build a random terrain, you are able to store the heightmap bitmap and reload later.
Creating an individual procedural terrain algorithm
You can also develop your own procedural algorithm by extending TRandomTerrainAlgorithm or any descendant. In the example below, we generate a random terrain:
- MyTerrainAlg.pas
type TMyTerrainAlgorithm = class(TRandomTerrainAlgorithm) protected procedure Generate(); public function GetHeightMap() : TBitmap; override; end; { TMyTerrainAlgorithm } procedure TMyTerrainAlgorithm.Generate(); var x, z: Integer; i : Integer; begin System.SetLength(FData, 256); for i := 0 to High(FData) do System.SetLength(FData[i], 256); for x := 0 to 255 do for z := 0 to 255 do begin FData[x, z] := Random(100) / 100; end; end; function TMyTerrainAlgorithm.GetHeightMap() : TBitmap; begin Generate(); result := inherited; end; LMyTerrainAlgorithm := TMyTerrainAlgorithm.Create(); try FTerrain.RandomTerrain(LMyTerrainAlgorithm); finally FreeAndNil(LMyTerrainAlgorithm); end;
Resolution
It is recommend to use 2 ^ X resolution sizes for your terrain. Set resolution by the published properties “ResolutionX” and “ResolutionY”.
The table below lists common terrain sizes and their resulting vertices.
Size | Vertex-Count | Index-Count | Triangles | Memory-Size |
---|---|---|---|---|
16 x 16 | 289 | 1536 | 512 | - |
32 x 32 | 1089 | 6144 | 2048 | - |
64 x 64 | 4225 | 24.576 | 8192 | - |
128 x 128 | 16.641 | 98.304 | 32.768 | - |
256 x 256 | 66.049 | 393.216 | 131.072 | - |
512 x 512 | 263.169 | 1.572.864 | 524.288 | |
1024 x 1024 | 1.050.625 | 6.291.456 | 2.097.152 | |
2048 x 2048 | ||||
4096 x 4096 |
Smoothing
Next step: Skybox