Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
terrain [2019/05/02 14:06] – [Resolution] adminterrain [Unknown date] (current) – removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-====== 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 ===== 
- 
-<file pascal 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; 
-</file> 
-  
- 
-===== Creating a terrain at runtime by procedural method ===== 
- 
-<file pascal 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; 
-</file> 
-  
-__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:  
- 
-<file pascal 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; 
-</file> 
- 
-===== 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 | 24576 | 8192 | - | 
-| 128 x 128 | 16641 | 98304 | 32768 | - | 
-| 256 x 256 | | | |  
-| 512 x 512 | | | |  
-| 1024 x 1024 | | | |  
-| 2048 x 2048 | | | |  
-| 4096 x 4096 | | | |  
-===== Smoothing ===== 
- 
- 
-Next step: [[skybox|Skybox]]