Search Unity

  1. Megacity Metro Demo now available. Download now.
    Dismiss Notice
  2. Unity support for visionOS is now available. Learn more in our blog post.
    Dismiss Notice

TerraLand 2 – High Quality Photo-Realistic Terrains from Real-World GIS Data

Discussion in 'Assets and Asset Store' started by TerraUnity, Jan 5, 2016.

  1. Deleted User

    Deleted User

    Guest


    Did you mean that generated 3D mesh data has TWICE the number of triangles as the terrains, not half?
     
  2. Deleted User

    Deleted User

    Guest

    Is there any guess as to when Caching be ready for the Runtime API? This would speed up the debugging process by not having to wait every time for new data to load to test code. Additionally, my product must run in offline mode too!
    It would also be needed to use the product with multiple scenes without having to reload all of the data as we show a different view of the same data in a different scene.
     
    Last edited by a moderator: Mar 21, 2017
  3. Deleted User

    Deleted User

    Guest

    How does one get notified the new terrain tiles are loaded or old ones discarded so that we can add associated data to the scene? I've looked through the API but no events or callbacks are obvious.
     
    TerraUnity likes this.
  4. Deleted User

    Deleted User

    Guest

    Sometime Runtime give mismatched terrain tiles. I have not found out how to consistently generate this error.

    upload_2017-3-22_11-52-13.png
     
    Last edited by a moderator: Mar 22, 2017
  5. Deleted User

    Deleted User

    Guest

    If the "Name" of the object the "Runtime" script is attached to (shown in both the Inspector and Hierarchy panels) is not exactly the text "World Generator", the following error will occur:
    NullReferenceException: Object reference not set to an instance of an object
    TerraLand.TerraLandRuntime.Initialize ()
    Runtime.Start ()

    All I did was rename it "WorldGeneator" to generate the error. Rename it back and the error goes away.
     
  6. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    First of all, please note that Runtime API is still in Beta development and lacks final touches and improvements. Hopefully the C# documentation of the system will be released to have a better idea of the parameters and the functions. We are on new year's holidays in here so bear with us for the slower development these days.

    Thanks for the mentioned value setting glitches, we will take a look at them in the future version. Yes, all values can't be set directly from the inspector yet, because some of them are hard coded and will be over written from the codes. Also finally you have to set and assign important parameters in order to setup the system properly. I suggest leaving those mentioned parameters to their default states as they are not important ones and are due to be removed in future versions. There's a quick start guide on our youtube channel regarding all exposed parameters in the WorldExplorer demo and focused on more important parameters in the video for you to get started.

    In order to have a proper and healthy system for now, set all parameters and do your coding exactly as your attached preview of the codes in the "MainMenu" script and customize important values as desired.

    Below is the function to setup all needed parameters in the system and all lines are important to be included. Call this function in the "Start" of your customized script and change its values in code as desired if you don't want to have a graphical menu scene at the intro:

    Code (CSharp):
    1. private void SetupSettings ()
    2.     {
    3.         TerraLand.TerraLandRuntime.sceneIsInitialized = false;
    4.         TerraLand.TerraLandRuntime.imagesAreGenerated = false;
    5.         TerraLand.TerraLandRuntime.terrainsAreGenerated = false;
    6.         TerraLand.TerraLandRuntime.worldIsGenerated = false;
    7.         TerraLand.TerraLandRuntime.farTerrainIsGenerated = false;
    8.  
    9.         // Main Settings
    10.         Runtime.terrainGridSizeMenu = currentGridSizeEnum;
    11.         Runtime.areaSizeMenu = areaSizeSlider.GetComponent<Slider>().value;
    12.         Runtime.heightmapResolutionMenu = (int)heightmapResolutionSlider.GetComponent<Slider>().value;
    13.         Runtime.imageResolutionMenu = (int)imageResolutionSlider.GetComponent<Slider>().value;
    14.         Runtime.elevationExaggerationMenu = elevationExaggerationSlider.GetComponent<Slider>().value;
    15.         Runtime.smoothIterationsMenu = (int)terrainSmoothnessSlider.GetComponent<Slider>().value;
    16.         Runtime.farTerrainMenu = farTerrainToggle.GetComponent<Toggle>().isOn;
    17.         Runtime.farTerrainHeightmapResolutionMenu = (int)farHeightmapResolutionSlider.GetComponent<Slider>().value;
    18.         Runtime.farTerrainImageResolutionMenu = (int)farImageResolutionSlider.GetComponent<Slider>().value;
    19.         Runtime.areaSizeFarMultiplierMenu = farMultiplierSlider.GetComponent<Slider>().value;
    20.  
    21.  
    22.         // Performance Settings
    23.         Runtime.heightmapPixelErrorMenu = Mathf.Clamp((200 - (terrainQualitySlider.GetComponent<Slider>().value * 2f)), 1f, 200f);
    24.         Runtime.farTerrainQualityMenu = Mathf.Clamp((200 - (farTerrainQualitySlider.GetComponent<Slider>().value * 2f)), 1f, 200f);
    25.         Runtime.cellSizeMenu = (int)cellSizeSlider.GetComponent<Slider>().value;
    26.         Runtime.concurrentTasksMenu = (int)concurrentTasksSlider.GetComponent<Slider>().value;
    27.         Runtime.elevationDelayMenu = elevationDelaySlider.GetComponent<Slider>().value;
    28.         Runtime.imageryDelayMenu = imageryDelaySlider.GetComponent<Slider>().value;
    29.  
    30.  
    31.         // Advanced Settings
    32.         Runtime.elevationOnlyMenu = elevationOnlyToggle.GetComponent<Toggle>().isOn;
    33.         Runtime.fastStartBuildMenu = fastStartBuildToggle.GetComponent<Toggle>().isOn;
    34.         Runtime.showTileOnFinishMenu = showTileOnFinishToggle.GetComponent<Toggle>().isOn;
    35.         Runtime.progressiveTexturingMenu = progressiveTexturingToggle.GetComponent<Toggle>().isOn;
    36.         Runtime.spiralGenerationMenu = spiralGenerationToggle.GetComponent<Toggle>().isOn;
    37.         Runtime.delayedLODMenu = delayedLODToggle.GetComponent<Toggle>().isOn;
    38.         Runtime.farTerrainBelowHeightMenu = farTerrainBelowSlider.GetComponent<Slider>().value;
    39.         Runtime.stitchTerrainTilesMenu = stitchToggle.GetComponent<Toggle>().isOn;
    40.         Runtime.levelSmoothMenu = (int)stitchSmoothnessSlider.GetComponent<Slider>().value;
    41.         Runtime.powerMenu = (int)stitchPowerSlider.GetComponent<Slider>().value;
    42.         Runtime.stitchDistanceMenu = (int)stitchDistanceSlider.GetComponent<Slider>().value;
    43.         Runtime.stitchDelayMenu = stitchDelaySlider.GetComponent<Slider>().value;
    44.  
    45.  
    46.         // Graphic Settings
    47.         GameManager.volumetricLightingMenu = volumetricLightingToggle.GetComponent<Toggle>().isOn;
    48.         GameManager.atmosphericScatteringMenu = atmosphericScatteringToggle.GetComponent<Toggle>().isOn;
    49.         GameManager.enableDetailTexturesMenu = enableDetailTexturesToggle.GetComponent<Toggle>().isOn;
    50.         GameManager.enableCloudsMenu = enableCloudsToggle.GetComponent<Toggle>().isOn;
    51.         GameManager.enableCloudShadowsMenu = enableCloudShadowsToggle.GetComponent<Toggle>().isOn;
    52.     }


    There are also some predefined default values for each category which are there as follows to get the idea of how you can set the parameters manually in code:

    Code (CSharp):
    1. public void DefaultMainSettings ()
    2.     {
    3.         gridSizeDropdown.GetComponent<Dropdown>().value = 1;
    4.         areaSizeSlider.GetComponent<Slider>().value = 20f;
    5.         heightmapResolutionSlider.GetComponent<Slider>().value = 1024;
    6.         imageResolutionSlider.GetComponent<Slider>().value = 1024;
    7.         elevationExaggerationSlider.GetComponent<Slider>().value = 1.25f;
    8.         terrainSmoothnessSlider.GetComponent<Slider>().value = 1;
    9.         farTerrainToggle.GetComponent<Toggle>().isOn = true;
    10.         farHeightmapResolutionSlider.GetComponent<Slider>().value = 512;
    11.         farImageResolutionSlider.GetComponent<Slider>().value = 1024;
    12.         farMultiplierSlider.GetComponent<Slider>().value = 6;
    13.     }
    14.  
    15.     public void DefaultPerformanceSettings ()
    16.     {
    17.         terrainQualitySlider.GetComponent<Slider>().value = 97;
    18.         farTerrainQualitySlider.GetComponent<Slider>().value = 95;
    19.         cellSizeSlider.GetComponent<Slider>().value = 128;
    20.         concurrentTasksSlider.GetComponent<Slider>().value = 8;
    21.         elevationDelaySlider.GetComponent<Slider>().value = 1.0f;
    22.         imageryDelaySlider.GetComponent<Slider>().value = 1.0f;
    23.     }
    24.  
    25.     public void DefaultAdvancedSettings ()
    26.     {
    27.         elevationOnlyToggle.GetComponent<Toggle>().isOn = false;
    28.         fastStartBuildToggle.GetComponent<Toggle>().isOn = true;
    29.         showTileOnFinishToggle.GetComponent<Toggle>().isOn = true;
    30.         progressiveTexturingToggle.GetComponent<Toggle>().isOn = true;
    31.         spiralGenerationToggle.GetComponent<Toggle>().isOn = true;
    32.         delayedLODToggle.GetComponent<Toggle>().isOn = false;
    33.            
    34.         farTerrainBelowSlider.GetComponent<Slider>().value = 500;
    35.         //farTerrainBelowSlider.GetComponent<Slider>().value = 0;
    36.  
    37.         stitchToggle.GetComponent<Toggle>().isOn = true;
    38.         stitchSmoothnessSlider.GetComponent<Slider>().value = 5;
    39.         stitchPowerSlider.GetComponent<Slider>().value = 1;
    40.         stitchDistanceSlider.GetComponent<Slider>().value = 2;
    41.         stitchDelaySlider.GetComponent<Slider>().value = 1f;
    42.     }
    43.  
    44.     public void DefaultGraphicSettings ()
    45.     {
    46.         volumetricLightingToggle.GetComponent<Toggle>().isOn = false;
    47.         atmosphericScatteringToggle.GetComponent<Toggle>().isOn = true;
    48.         enableDetailTexturesToggle.GetComponent<Toggle>().isOn = true;
    49.         enableCloudsToggle.GetComponent<Toggle>().isOn = true;
    50.         enableCloudShadowsToggle.GetComponent<Toggle>().isOn = false;
    51.     }

    In the future, a more minimal demo scene with core settings will be provided for an easier scene setup as suggested.
     
    jamexist likes this.
  7. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    No, they are exactly the same, but I think I have to review the text in the description for the triangles and vertices count of the terrain and mesh not to confuse or misunderstand people :)
     
  8. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Yes, we know that reloading the entire scene every time is a real pain in the... but as already stated the Caching and Offline Loading of data through custom online/offline geo-servers is our top priority right now and has been progressed well up to date.

    Can't give an exact release date but will definitely be in the next update not too far from us.
     
  9. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Good question, all current needed parameters for the system are accessible by writing "TerraLand.TerraLandRuntime" in your lines of codes. Just put a period after that and check out all parameters. Many callbacks and getters are due to be added in the future as they are nonexistent for now.

    Note that all exposed parameters are only getters and they can not be set as they will be modified internally. And all exposed functions are being called internally too, so don't try to call them directly as it interrupts the system, unless you know what you mean.

    Below are some of the current important exposed parameters out of the TerraLandRuntime core:

    • TerraLand.TerraLandRuntime.croppedTerrains => (List<Terrain>) List of all reusable terrain chunks as terrain gameobjects in the scene for processing
    • TerraLand.TerraLandRuntime.splittedTerrains => (GameObject) The parent gameobject in the scene which all terrain chunks are put under this object as its children
    • TerraLand.TerraLandRuntime.farTerrainIsGenerated =>(bool) Turns to true when Far Terrain is generated at the scene initialization. One of the main steps to set the "WorldIsGenerated" to true and start gameplay.
    • TerraLand.TerraLandRuntime.images => (List<Texture2D>) List of all satellite images as Texture2Ds draped on terrains
    • TerraLand.TerraLandRuntime. top/left/bottom/right => (string) Current dynamic area's Top, Left, Bottom & Right coordinates in Decimal Degrees format as boundaries.

    • TerraLand.TerraLandRuntime. topFar/leftFar/bottomFar/rightFar => (string) Current Far Terrain's dynamic area's Top, Left, Bottom & Right coordinates in Decimal Degrees format as boundaries.
    • TerraLand.TerraLandRuntime. northCounterGenerated/southCounterGenerated/eastCounterGenerated/westCounterGenerated => (int) Number of generated terrains in North, South, East or West since level start.
    • TerraLand.TerraLandRuntime.stitchingTerrainsList => (List<Terrain>) List of terrain chunks re-positioned based on player moves/orientations which is going to be updated after each North/South/East/West terrain generation. Useful to know certain reusable terrain's current geo-position in the scene.

    Also there are some getters in the "InfiniteTerrain" script. Put a period after that and check out accessible parameters.
     
    Last edited: Apr 27, 2017
  10. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    We have re-written terrain switching/stitching and dynamic loading/unloading of the reusable terrains from scratch. So none of these errors and glitches will be there in the future version. Currently these artifacts appear when player speed is too fast to generate newer terrains but the system has been improved to avoid these situations.

    To be more specific regarding current occasions, 2 main factors for a healthy system in Runtime API are the "Running Machine Specs" & the "Internet Connection Speed". Whenever these 2 factors are not in a good state or the player is moving fast, these errors may occur. But again we have re-designed the system to have faster and more proper way of terrain switching so you won't face these issues any more.
     
  11. Galahad

    Galahad

    Joined:
    Feb 13, 2012
    Posts:
    72
    This is what I get when trying to generate a terrain with the Highest preset:
    terralandError.PNG
    What could be causing this "pixelated" height map?
     
  12. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Yes, that's intentional as it is hard coded in TerraLand's core. It's safer to avoid renaming any prefabs and main provided gameobjects in your project and scene.

    Thanks for reporting that, we will include these info later in the documentation and help files.
     
  13. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    This question has been asked many times in the past and the reasons and solutions are there to investigate. Below I redirect you to the existing replies in the past:


    Download demo project regarding Terrain Resolutions and Smoothness Operation from here: http://terraunity.com/freedownload/TerraLand-HeightmapAndResolution.unitypackage

    Corresponding info post:
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-5#post-2878638



    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-5#post-2910354

    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-5#post-2916928


    Read through this tutorial written in 3 posts to get started about Terrain Smoothness along with some other useful info to finally create Moon surface:
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-3#post-2682805


    And finally here is the part of the WorldExplorer video tutorial about Smoothness Steps in TerraLand's core settings:
    Smoothness Steps in WorldExplorer Explained
     
    Galahad likes this.
  14. Galahad

    Galahad

    Joined:
    Feb 13, 2012
    Posts:
    72
    Thank you very much for the elaborated answer. I've done some searches for this problem but, the truth is, I didn't even know which terms use to describe this issue.

    I'll be using smoothing from now on.

    Regards
     
    TerraUnity likes this.
  15. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    A picture is worth a thousand words... That's what you did and got your answer quickly ;)
     
    Galahad likes this.
  16. Deleted User

    Deleted User

    Guest

    I have looked at these. But your descriptions doesn't say "how" to use them. Am I suppose to keep "polling" these lists looking for changes? I hope not. Please briefly describe how to use them to load and unload data when the world coordinate system changes underneath the models.

    In my game, the TerraLand tracking camera usually follows the player object. But the user is also allowed to pan around the camera independent of the player. If panned too far away from the player, how should the player object be handled when the terrain coordinate system moves away from it?
     
  17. laynardo

    laynardo

    Joined:
    Mar 21, 2015
    Posts:
    10
    Hi, I am using the latest Terra Land on Mac. It is hanging on Initializing Satellite Image Downloader. I tried what was stated earlier in this thread, and that didn't work. I am getting this error, if it means anything "ArgumentException: GUILayout: Mismatched LayoutGroup.Repaint"
     
  18. Deleted User

    Deleted User

    Guest

    Normally my camera follows the player and the map gets generated according to the cameras movement. However, it is possible to "unlock" the camera from the player and pan around. New tiles are generated accordingly to the position of the camera. However when panning around, if the location of the player moves off of the generated map causing TerraLand to shift the world coordinates around, an error occurs:

    NullReferenceException: Object reference not set to an instance of an object
    (wrapper dynamic-method) . (object) <IL 0x00003, 0x00043>
    InfiniteTerrain.UpdatePositions () <IL 0x00087, 0x003a4>
    InfiniteTerrain.Update () <IL 0x004aa, 0x01e18>
     
  19. antoripa

    antoripa

    Joined:
    Oct 19, 2015
    Posts:
    1,163
    Hello,
    I am getting issue with Unity 5.6 ....
     
  20. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Callbacks for current Movement Direction, Updating Terrains and time when these coordinates and world bounds change are set to private for now and they are not accessible through the API yet. But fortunately by using previously mentioned callbacks which are present and combining them we can can extract all needed info in your case.

    To give you a better idea on how to use existing API, following is a sample code added to the "GameManager" script to retrieve Player's Direction, Terrains which are offset due to world bounds change based on player position and the time that the offset is happening.


    Code (CSharp):
    1. private string direction;
    2. private double currentNorthCoord;
    3. private double currentSouthCoord;
    4. private double currentEastCoord ;
    5. private double currentWestCoord;
    6. private bool coordsInitialized = false;
    7. private int gridSize;
    8. private int totalTerrainsCount;
    9. private int startIndex;
    10. private int endIndex;
    11.  
    12. void Update ()
    13. {
    14.     if(!playerIsSet)
    15.         LoadingScreen();
    16.     else
    17.     {
    18.         /*
    19.         * Check if world bounds altered based on player position. Either NORTH or SOUTH and EAST or WEST coordinates change accordingly,
    20.         * so checking one of the two will suffice. In this case we check changes in North & East coordinates to detect any Vertical or Horizontal bounds offset.
    21.         * Please note that this method is not optimized and the API will be updated to include its native proper checks.
    22.         */
    23.  
    24.         // Initialize checking coordinates only once at start of Update
    25.         if(!coordsInitialized)
    26.         {
    27.             currentNorthCoord = double.Parse(TerraLand.TerraLandRuntime.top);
    28.             currentSouthCoord = double.Parse(TerraLand.TerraLandRuntime.bottom);
    29.             currentEastCoord = double.Parse(TerraLand.TerraLandRuntime.right);
    30.             currentWestCoord = double.Parse(TerraLand.TerraLandRuntime.left);
    31.  
    32.             gridSize = TerraLand.TerraLandRuntime.gridSizeTerrain;
    33.             totalTerrainsCount = (int)Mathf.Pow(gridSize, 2);
    34.  
    35.             coordsInitialized = true;
    36.         }
    37.  
    38.         // Check & Compare Vertical coordinates on bounds offset
    39.         if(currentNorthCoord != double.Parse(TerraLand.TerraLandRuntime.top))
    40.         {
    41.             if(currentNorthCoord < double.Parse(TerraLand.TerraLandRuntime.top))
    42.             {
    43.                 direction = "Moving Direction is NORTH. Updating Terrains Are:";
    44.                 print(direction);
    45.  
    46.                 // Get current South terrains which are offset
    47.                 startIndex = totalTerrainsCount - gridSize;
    48.                 endIndex = totalTerrainsCount;
    49.  
    50.                 for(int i = startIndex; i < endIndex; i++)
    51.                     print(TerraLand.TerraLandRuntime.stitchingTerrainsList[i]);
    52.  
    53.                 //Do your awesome stuff here...
    54.             }
    55.             else
    56.             {
    57.                 direction = "Moving Direction is SOUTH. Updating Terrains Are:";
    58.                 print(direction);
    59.  
    60.                 // Get current North terrains which are offset
    61.                 startIndex = 0;
    62.                 endIndex = gridSize;
    63.  
    64.                 for(int i = startIndex; i < endIndex; i++)
    65.                     print(TerraLand.TerraLandRuntime.stitchingTerrainsList[i]);
    66.  
    67.                 //Do your awesome stuff here...
    68.             }
    69.  
    70.  
    71.             currentNorthCoord = double.Parse(TerraLand.TerraLandRuntime.top);
    72.             currentSouthCoord = double.Parse(TerraLand.TerraLandRuntime.bottom);
    73.         }
    74.  
    75.         // Check & Compare Horizontal coordinates on bounds offset
    76.         if(currentEastCoord != double.Parse(TerraLand.TerraLandRuntime.right))
    77.         {
    78.             if(currentEastCoord < double.Parse(TerraLand.TerraLandRuntime.right))
    79.             {
    80.                 direction = "Moving Direction is EAST. Updating Terrains Are:";
    81.                 print(direction);
    82.  
    83.                 // Get current West terrains which are offset
    84.                 startIndex = 0;
    85.                 endIndex = (totalTerrainsCount - gridSize) + 1;
    86.  
    87.                 for(int i = startIndex; i < endIndex; i+= gridSize)
    88.                     print(TerraLand.TerraLandRuntime.stitchingTerrainsList[i]);
    89.  
    90.                 //Do your awesome stuff here...
    91.             }
    92.             else
    93.             {
    94.                 direction = "Moving Direction is WEST. Updating Terrains Are:";
    95.                 print(direction);
    96.  
    97.                 // Get current East terrains which are offset
    98.                 startIndex = gridSize - 1;
    99.                 endIndex = totalTerrainsCount;
    100.  
    101.                 for(int i = startIndex; i < endIndex; i+= gridSize)
    102.                     print(TerraLand.TerraLandRuntime.stitchingTerrainsList[i]);
    103.  
    104.                 //Do your awesome stuff here...
    105.             }
    106.  
    107.             currentEastCoord = double.Parse(TerraLand.TerraLandRuntime.right);
    108.             currentWestCoord = double.Parse(TerraLand.TerraLandRuntime.left);
    109.         }
    110.     }
    111. }


    Currently in TerraLand Runtime, world offsetting & bounding area is updated based on the Main Camera in the scene. The corresponding variable for this (Camera.main) is also private and hard-coded thus not yet accessible through the API. But we can work around this limitation for now as following.

    • As the world updates based on Main Camera's position, find the Main Camera in the scene and make it the child of the desired game object which has to be the subject for world updating
    • Disable Main Camera's rendering by un-checking the Camera component on the camera object to avoid performing the render
    • Place the desired camera that has to render in the scene and make sure that its gameobject "tag" is anything except "MainCamera"
    • Drag & Drop this camera into the "Cam" field of the "GameManager" script or set this camera as the rendering camera in your own custom scripts
    • Make sure that none of the scripts in your project get the rendering camera by its tag (MainCamera) as we already disabled its Camera component


    All above mentioned callbacks and variables will be available and accessible in future versions of the Runtime API so you won't need to do any of the above coding and similar implementations.
     
    jamexist likes this.
  21. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    This is not related to the mentioned warning you get at all and its has been discussed several times here:
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-3#post-2649421
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-3#post-2649603
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-3#post-2674496


    But regarding the hanging on Satellite Image Downloader, it's mostly because of bad network connection or blocked IPs. These issues are generally related to network problems caused by router settings, firewalls and ISPs. A similar case has been already reported which may help you in this:

    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-5#post-2940087

    Are you able to receive elevation data in TerraLand or the behavior is the same as the Satellite Image Downloader?
     
  22. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    As already stated in my previous reply to your question, the world gets updated based on the main camera position in your scene and I mentioned a temporary workaround regarding this, until the moving gameobject will be available to be set from the API.

    As in your case the camera pans around the player and has quick position changes, TerraLand tries to update & offset terrains for multiple times before the previous update gets finished. So any sudden changes in camera position and any quick movements of the camera causes this error and issue in the current version.

    So as for now, stick with the previous solution mentioned to stay safe on terrain updating operations. The terrain offsetting and updating on camera moves has been improved a lot to avoid these issues in order to properly bypass or operate needed changes even on sudden and quick position changes which will be available in the next version.
     
  23. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Yes, we had dozens of reports about 5.6 issues last week.

    On 5.6 you will receive the error "ArgumentNullException: Argument cannot be null" and that's why the plugin GUI even won't start. In 2017.1 Beta 1 Unity crashes when trying to bring up the plugin.

    We could sort out the issue and the next version with bug fix will be up in a few days.

    Unity used to have a stable API except any major version updates which is normal but since the 5 came out we saw significant changes even in every minor update. Painful for developers but lovely for all as it shows the engine is growing in specific fields.
     
    jf3000 and antoripa like this.
  24. jf3000

    jf3000

    Joined:
    Dec 31, 2013
    Posts:
    166
    @TerraUnity What happened to the input option for the RAW, all I see is ascii??
     
  25. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    If you mean the input for the custom elevation data files in order to create terrains, you have to use the component "TerraLand Terrain". There you can find the input options for 3 formats of Raw, Ascii & Tiff.

    The subject has been discussed many times before as follows:

    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-2#post-2599837
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-5#post-2971528
    Video tutorial on using TerraLand Terrain to work with custom elevation & imagery data
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-3#post-2682805
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-3#post-2700657






    Note: If you don't insert an existing terrain object in "Single Terrain" field or existing terrains parent object into the field of "Terrain Chunks", so new terrains will be generated upon pressing the "Generate" button at the bottom of the TerraLand Terrain UI. You can set the settings for newly generating terrains in the "New Terrain Settings" section.

    Having terrain(s) inserted into the terrain fields mentioned earlier will update the heights on those inserted terrain when pressing the "Generate" button.
     
    Last edited: May 2, 2017
  26. jf3000

    jf3000

    Joined:
    Dec 31, 2013
    Posts:
    166
    @TerraUnity When do you expect a new version to come out fixing the above issues? Basically we can't use your product until the error is fixed.
     
  27. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    You can still use it in Unity prior to 5.6 version, however all bug fixes and API upgrades are implemented and will be released in a few hours.
     
    jf3000 likes this.
  28. jf3000

    jf3000

    Joined:
    Dec 31, 2013
    Posts:
    166
    You cant use it at all, errors, thousands millions, completely broken.
     
  29. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    What do you mean? In 5.6 or before versions? What are the errors?
     
  30. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    TerraLand 2.1.2 has been released and is available in your account from here: http://terraunity.com/my-account/

    The update includes Unity 5.6 & 2017 Beta compatibility along with some minor API upgrades and bug fixes. The new package name is "TerraLand – TerraLand 2.1.2 (Unity 5.6+)" siting beside the old packages.

    Satellite Image Downloader setup in project launcher window (TerraLandSettings.cs) now asks Unity install location on Mac systems to avoid wrong path to the config files.

    The AssetStore version will be updated to the latest version whenever the RunTime API is in its stable state soon.
     
    jf3000 likes this.
  31. HazardousToast

    HazardousToast

    Joined:
    Jan 25, 2017
    Posts:
    1
    Hello @TerraUnity

    This asset looks incredible, and I want to use it in a project where I work. However, I'm sitting behind a fairly heavy firewall where I work. Is there a list of URLs/ports I can hand my IT folks to get opened up, so I can utilize Terraland's full capability? Thanks!
     
  32. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Glad you like TerraLand ;-) TerraLand connects to ESRI Elevation & Imagery web services through the following hostnames & ports:

    TerraLand_Hostname-Port.jpg

    elevation.arcgis.com:80 for the elevation service
    services.arcgisonline.com:80 for the imagery services

    I'm not exactly sure about the IP range but seems like it is in the range of 23.20.0.0 ~ 23.255.255.255. So best bet is to open these IPs and test it with TerraLand multiple times to see if it works.
     
  33. tgaldi

    tgaldi

    Joined:
    Oct 28, 2015
    Posts:
    102
    @TerraUnity when will the update for Unity 5.6 be available on the asset store?
     
  34. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    It's already available and downloadable when you purchase TerraLand.

    If you make the purchase directly from our website, it's already there as a separate package in your account and if you buy it from the AssetStore you need to let us know so that we manually setup an account on our website to get access to the latest TerraLand packages.

    So no matter whether you buy it directly from our website or AssetStore, all latest packages will be there in your account.
     
  35. tgaldi

    tgaldi

    Joined:
    Oct 28, 2015
    Posts:
    102
    Hmm. When I import the package I get the Unity popup about upgrading scripts using obsolete API's. If I upgrade and try to use any of the TerraLand tools Unity crashes. If I do not upgrade none of the tools come up when I choose them. I downloaded the package from the asset store 2 days ago. I'm using Unity free, Windows 10.
     
  36. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    As I already said, the AssetStore version is not updated yet. So do the following to get the latest package:

    Register on our website from here: http://terraunity.com/my-account/ and send us the AssetStore's payment Invoice No. through the email.

    So we can confirm the purchase and setup your account to have access to the latest packages as described here.
     
  37. tgaldi

    tgaldi

    Joined:
    Oct 28, 2015
    Posts:
    102
    Thank you for the assistance. I have TerraLand working and building really nice databases.

    I don't know if you'd be able to assist me in this, but I am having issues with object placement on the database. When I place an object I'm converting coordinates from Earth Centric Earth Fixed to Unity coordinates. I've converted the Unity coordinates into Geodedic and confirmed the location visually on sites such as:

    http://www.latlong.net/degrees-minutes-seconds-to-decimal-degrees

    But visually the object's location is a bit off on the TerraLand database.

    I've set the resolution to Highest, Pixel Error Quality to 1, Turned off Constrain Aspect Ration, Hightmap Resolution is 8192, and Satellite Image Pixel Resolution is 4096.
     
  38. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    You are welcome. That's a good question as many others try to implement the similar scenario.

    To make things easier, you can simply create a preset out of your settings in TerraLand UI and share it with us so that everyone can check it out.

    To do so, simply press the Preset Management tab on the upper right of the UI and click Save Preset, so that a custom preset file will be generated with a given name for later usage or for sharing with others. To load previously adjusted settings out of your saved presets, simply go the Preset Management tab again and this time click on the Load Preset button to have the desired preset settings upon selection.

    Regarding your question, note that any generated terrains in TerraLand are centered at the Zero (0, 0, 0) position in the scene. This is to lower the loss of floating point precision whenever moving further away for the scene's world space origin.

    So maybe you have to offset objects relative to this situation or offset generated terrains so that the lower-left corner of the terrain(s) are at Zero position just like when you create a new terrain in the scene from Unity menu (Create a new terrain and see it for yourself).

    However I suggest moving objects to match with centered terrains for a proper setup. The offset value can be easily calculated. Just subtract the half of total terrain(s) width & height units from the object's x,z vector position coordinates. For example, if the object is at zero position and the terrain(s) size is 6000 x 4000, the final x,z offset position of the object must be -3000, -2000.

    Also there are 2 options which are critical in this case, one is the "Units To 1 Meter" in "Area Size" section and the other one is the "Set Units To 1 Meter" button in the "New Terrain Settings" section which they both do the same thing. The latter do it just once upon clicking the button while the other one locks the generating terrain size to be always at proper values. What this term "Units To 1 Meter" means is that each Unity unit in the scene will be considered as 1 meter to have a perfect scene setup based on this occasion.

    Also this options becomes vital when you need to overlap multiple layers of terrains for a customized scene setup as shown in the video here:




    Furthermore, if you are sure that the converted coordinates are correct, As TerraLand can even generate rectangular terrain areas, the final terrain area based on your adjusted boundaries in Area Size & consequently Interactive Map may be a rectangular instead of a square one. So "Constrain Aspect Ratio" option will be enabled automatically in order to keep the terrain(s) shape exactly matched with the original boundaries and avoid forced square terrains.

    If none of the above are true, let us know more about your setup and share the preset with us so that we can help you out in this.
     
    jamexist and Excir like this.
  39. tgaldi

    tgaldi

    Joined:
    Oct 28, 2015
    Posts:
    102
    I had to save the preset file as (.txt) because (.settings) is not supported by the uploader.

    I have the Terrain at (0,0,0) and I'm using the Lat/Lon of the database origin for conversion from GeoCentric to Unity coordinates with the following formula/function which uses the WGS86 ellipsoid:

    Code (CSharp):
    1.     public static void EcefToEnu( double x, double y, double z,
    2.                                  double lat0, double lon0, double h0,
    3.                                  out float xEast, out float yNorth, out float zUp )
    4.     {
    5.         var lambda = lat0 * PI_DIV_180;
    6.         var phi = lon0 * PI_DIV_180;
    7.         var s = Math.Sin( lambda );
    8.         var N = a / Math.Sqrt( 1 - e_sq * s * s );
    9.  
    10.         var sin_lambda = Math.Sin( lambda );
    11.         var cos_lambda = Math.Cos( lambda );
    12.         var cos_phi = Math.Cos( phi );
    13.         var sin_phi = Math.Sin( phi );
    14.  
    15.         double x0 = ( h0 + N ) * cos_lambda * cos_phi;
    16.         double y0 = ( h0 + N ) * cos_lambda * sin_phi;
    17.         double z0 = ( h0 + ( 1 - e_sq ) * N ) * sin_lambda;
    18.  
    19.         double xd, yd, zd;
    20.         xd = x - x0;
    21.         yd = y - y0;
    22.         zd = z - z0;
    23.  
    24.         xEast = (float)(-sin_phi * xd + cos_phi * yd);
    25.         yNorth = (float)(-cos_phi * sin_lambda * xd - sin_lambda * sin_phi * yd + cos_lambda * zd);
    26.         zUp = (float)(cos_lambda * cos_phi * xd + cos_lambda * sin_phi * yd + sin_lambda * zd);
    27.     }
    I swap the North and Up (Z and Y) output since Unity is left handed.

    I use GeoTrans (http://earth-info.nga.mil/GandG/geotrans/) to convert from Unity coordinates to Geodedic to check if the coordinates are correct.
     

    Attached Files:

  40. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    You don't ever need to use any external converters or GIS software for this purpose because all needed data is already available in TerraLand interface.

    We need the following values in order to do proper geo-referencing operations in Unity:

    (The following 2 values are found in TerraLand Downloader's "Area Location" section)
    • public double originLatitude; Origin Latitude coordinate of the database & generated terrain area
    • public double originLongitude; Origin Longitude coordinate of the database & generated terrain area

    36.87916, -111.5105

    TerraLand_AreaLocation.jpg




    (The following 2 values are found in TerraLand Downloader's "Area Size" section)
    • public double areaHeight; Length of the generated area in meters
    • public double areaWidth; Width of the generated area in meters

    12000, 12000


    TerraLand_AreaSize.jpg



    (The following 4 values are found in TerraLand Downloader's "Terrain Bounds" tab)
    • public double areaTop; Top Latitude coordinate of the generated area
    • public double areaBottom; Bottom Latitude coordinate of the generated area
    • public double areaLeft; Left Longitude coordinate of the generated area
    • public double areaRight; Right Longitude coordinate of the generated area

    Top: 36.9330589170472, Bottom: 36.8252610829528, Left: -111.577881816826 & Right: -111.443118183174

    TerraLand_AreaBoundaries.jpg



    And then we can simply convert any Latitude/Longitude points of interests into Unity's world space in our scene. Here is the following script to get geo-referenced object position in Unity world space and move it to desired Latitude/Longitude coordinates right in the Editor.

    Code (CSharp):
    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4.  
    5. [ExecuteInEditMode]
    6. public class LatLon2Unity : MonoBehaviour
    7. {
    8.     public double originLatitude;
    9.     public double originLongitude;
    10.     public double areaHeight;
    11.     public double areaWidth;
    12.  
    13.     public double areaTop;
    14.     public double areaBottom;
    15.     public double areaLeft;
    16.     public double areaRight;
    17.  
    18.     public bool forceMoveToLatLon = false;
    19.     public double destinationLat;
    20.     public double destinationLon;
    21.  
    22.     private double currentLatitude;
    23.     private double currentLongitude;
    24.  
    25.     void Update ()
    26.     {
    27.         if(transform.position.z >= 0)
    28.             currentLatitude = originLatitude + ((areaTop - areaBottom) * (Mathf.InverseLerp(0, (float)areaHeight, transform.position.z)));
    29.         else
    30.             currentLatitude = originLatitude - ((areaTop - areaBottom) * (Mathf.InverseLerp(0, (float)areaHeight, -transform.position.z)));
    31.  
    32.         if(transform.position.x >= 0)
    33.             currentLongitude = originLongitude + ((areaRight - areaLeft) * (Mathf.InverseLerp(0, (float)areaWidth, transform.position.x)));
    34.         else
    35.             currentLongitude = originLongitude - ((areaRight - areaLeft) * (Mathf.InverseLerp(0, (float)areaWidth, -transform.position.x)));
    36.  
    37.         print("Current Lat: " + currentLatitude + "   Lon: " + currentLongitude);
    38.  
    39.         if(forceMoveToLatLon)
    40.             MoveToLatLon();
    41.     }
    42.  
    43.     private void MoveToLatLon ()
    44.     {
    45.         transform.position = new Vector3
    46.             (
    47.                 (float)(((destinationLon - areaLeft) / (areaRight - areaLeft)) * (areaWidth)) - (float)(areaWidth / 2f),
    48.                 0,
    49.                 (float)(((destinationLat - areaBottom) / (areaTop - areaBottom)) * (areaHeight)) - (float)(areaHeight / 2f)
    50.             );
    51.     }
    52. }
    53.  
    54.  

    Following picture shows a geo-referenced object placed exactly at given coordinates of "36.9005219376448, -111.458823759922". Location on Google Maps


    TerraLand_GeoreferencedObject_LatLonToUnityWorldSpace.jpg


    Here is the free download of full scene for the above implementation:
    terraunity.com/freedownload/TerraLand_LatLon2UnityWorldSpace.unitypackage


    FYI, the "TerraLand Terrain" component has built-in coordinates converter between "Minute, Degree, Second" (MDS) to Decimal Degrees (DD) GIS formats and vice versa, so no need to go for online converters such as the one you mentioned.
     
    Last edited: Oct 3, 2017
    henryqng and jamexist like this.
  41. davaguco

    davaguco

    Joined:
    Feb 21, 2017
    Posts:
    20
    Your website is down.
     
  42. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Yes, it was down for maintenance, but it's now up and running as it should.
     
  43. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    jamexist likes this.
  44. tgaldi

    tgaldi

    Joined:
    Oct 28, 2015
    Posts:
    102
    Thanks for the sample scene. Using the LatLon2Unity formula does put the object at the correct position.

    I was only using the external software to verify that my coordinates are correct. My application is receiving Geocentric coordinates and I'm converting them to Cartesian using the function in my previous post. I'll now have to convert from Geocentric to Geodedic and than LatLon2Unity. Is this because there is some precision loss when generating a database with TerraLand?
     
  45. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    You are welcome. Yes, using the formula you will get the exact location of any given lat/lon coords. https://goo.gl/maps/B69g4A2YgvJ2


    I couldn't understand what the question is or any relevant words! Do you receive any precision errors for placement?

    Please note that Unity's coordinate system is at floating precision and not doubles if you need very accurate GIS position. So as you see the values in my formula takes doubles but finally needs to convert them down into floats in order to yield Unity's compatible floating precision coordinates for the 3D positions.

    In addition you will get more accurate results whenever you are closer to the world origin at 0,0,0 vector in the scene due to single-precision floating point errors at further locations.
     
  46. Heisenberg1986

    Heisenberg1986

    Joined:
    May 29, 2017
    Posts:
    3
    I would like to import some terrain and then 'scale' the terrain, more specifically, if the real world size is 5km by 5km, I would like to scale it down to a few meters, to have a miniature version of the terrain. Can this be done with TerraLand?
     
  47. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    Yes, that's easily doable as TerraLand has been built with user customization in mind. Refer to the following hints to get started:

    Import own custom Elevation & Satellite Imagery data files in TerraLand and generate terrains out of them:



    In "New Terrain Settings" section of TerraLand there are 2 value fields of x & y for Area Size Units. These 2 values are the width and length of the new generating terrains that users can set them to any arbitrary values (in your case miniature values) in order to define the scale of terrains.

    Also in "Offline Data" section of TerraLand Downloader, you can insert any existing terrain(s) in your scene so that heights and imagery will be applied on these existing terrains without changing its original scale.

    In addition, in "TerraLand Terrain" component, again you have the above form of options to set arbitrary values for the terrains' scale in the "Offline Data" & "New Terrain Settings" sections.



    More Info:

    There is a setting in TerraLand which takes each unit as 1 meter while generating new terrains, so if you have a terrain area of 8x8 km2, your terrains will cover a 8000x8000 Unity units in your scene as Tournament demo. The Tournament has 8x8 km2 for main centered terrains and 16x16 km2 for covering distant terrains mixing together. The technique and the implementation is described in here:



    "SET UNITS TO 1 METER" button in "New Terrain Settings" section: You will notice that in there, you can set any arbitrary Area Size Units value for the whole generating area to define final terrain size in Unity units. When you press the "SET UNITS TO 1 METER" button, each Unity units will be considered as 1 meter.

    So for example a 10km x 10km area on map will generate an area of 10000 Unity units for generating terrains in the scene whether it's a single terrain or a set of terrain tiles. There is also an info box below this button to display each units real-world meters and each terrain chunk's final size in kilometers.

    Setting the Unity units to be considered as 1 meter in real-world by the above option makes the scales of everything in the scene to be perfectly matched up with the terrain(s). Suppose that you have to import a car into the scene and get it running, so if you have setup the 3D car model's scale correctly based on "1 meter = 1 unit" in Unity, everything will be setup and hopefully make your life easier.

    FYI, in WorldExplorer demo of Runtime Features, each Unity units is also considered as 1 meter to scale up the scene and other 3D elements correctly as real-world scales.

    In TerraLand, 2 options are critical, one is the "Units To 1 Meter" in "Area Size" section and the other one is the "Set Units To 1 Meter" button in the "New Terrain Settings" section which they both do the same thing. The latter do it just once upon clicking the button while the other one locks the generating terrain size to be always at proper values. What this term "Units To 1 Meter" means is that each Unity unit in the scene will be considered as 1 meter to have a perfect scene setup based on this occasion.

    Also this options becomes vital when you need to overlap multiple layers of terrains for a customized scene setup as shown in the video here:




    The above methods is just to show how flexible and customized can TerraLand get for various use cases. Just select one of the methods and do the rest of your desired modifications.
     
    Heisenberg1986 likes this.
  48. castor76

    castor76

    Joined:
    Dec 5, 2011
    Posts:
    2,517
    I am interested with this asset on making terrain to mesh feature.

    After generating terrain, I want to make it as an optimised mesh to render it as fast as possible. How much of options is there for me to reduce the mesh triangle count?

    Also, can I export textures for the mesh ? ( albedo , normal, height etc ) ?

    Also is there any trials I can play with? Just can't make up mind not knowing if this tool will do the job or not.
     
  49. TerraUnity

    TerraUnity

    Joined:
    Aug 3, 2012
    Posts:
    1,247
    The Terrain To Mesh conversion in "TerraLand Terrain" component is a simple procedure to firstly select corresponding terrain(s) in the scene, set creating mesh resolution and pressing the "Convert Terrain To Mesh" button.

    TerraLand_Terrain2Mesh.jpg


    The above screenshot is from the pdf help file of TerraLand available here: http://terraunity.com/doc/TerraLand_Docs.zip

    You have the options to select between Triangles or Quad vertices for the mesh, the final mesh resolution of 16th, 8th, 4th, half and full resolution of the original terrain data and option to place the generated mesh in the scene after finishing the conversion.

    For a more detailed explanation of terrain to mesh conversion, refer to the following post:
    https://forum.unity3d.com/threads/t...eal-world-gis-data.377858/page-5#post-2971528


    No, currently texture manipulation for mesh conversion is not supported. But there are many sources available to do splatmapping on mesh objects through shaders. Producing a simple form of this shader is easy to do, so we can also help you out in that if you really need it.


    TerraLand was the first plugin on this subject in the Terrain category of the market, so note that all features were here before any other similar assets out there and they grabbed the ideas later. Also we have a very transparent form of development so that all users can get needed info through forums, help files, email supports and finally our YouTube channel with lots of tutorial and showcase contents in here:
    https://www.youtube.com/user/TerraUnity
     
    antoripa likes this.
  50. Yasei_no_otoko

    Yasei_no_otoko

    Joined:
    Nov 25, 2013
    Posts:
    13
    What did you use for cloud assets of World Explorer?
    Is it Volumetric?