Wayback Machinekoobas.hobune.stream
May JUN Jul
Previous capture 12 Next capture
2021 2022 2023
1 capture
12 Jun 22 - 12 Jun 22
sparklines
Close Help
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
  • Asset Store
  • Get Unity

UNITY ACCOUNT

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account
  • Blog
  • Forums
  • Answers
  • Evangelists
  • User Groups
  • Beta Program
  • Advisory Panel

Navigation

  • Home
  • Products
  • Solutions
  • Made with Unity
  • Learning
  • Support & Services
  • Community
    • Blog
    • Forums
    • Answers
    • Evangelists
    • User Groups
    • Beta Program
    • Advisory Panel

Unity account

You need a Unity Account to shop in the Online and Asset Stores, participate in the Unity Community and manage your license portfolio. Login Create account

Language

  • Chinese
  • Spanish
  • Japanese
  • Korean
  • Portuguese
  • Ask a question
  • Spaces
    • Default
    • Help Room
    • META
    • Moderators
    • Topics
    • Questions
    • Users
    • Badges
  • Home /
avatar image
0
Question by JForrestna · Feb 21, 2018 at 10:51 PM · terraindatasetheights

Issue copying heightmaps from a LARGE terrain to a new, small, cutout Terrain with GETHEIGHTS and SETHEIGHTS

I have a large terrain and I have successfully cut out a section and copied all information over to a newly created and smaller terrain/terraindata and shown it in game. The only issue I seem to have is GetHeights and SetGeights.

Getheights seems to correctly get the correct height information but when I use setheights on the new terrain, it SCALES the information to the smaller terrain. So, lets say I want to create a new terrain that is 1/2 the size in both width and height, The code I use is:

     TerrainData workData = new TerrainData();
     Terrain workTerrain = Terrain.CreateTerrainGameObject(workData).GetComponent<Terrain>();
     workData.heightmapResolution = sourceTerrain.terrainData.heightmapResolution;
     workData.size = new Vector3(Size, sourceTerrain.terrainData.size.y, Size); // Size

     float[,] sourceHeights = sourceTerrain.terrainData.GetHeights(X, Y, Size, Size);
     workData.SetHeights(0, 0, sourceHeights);

This code will copy over the heights, but everything is CRUSHED and the rest of the terrain is flat. in the inspector, when I change the new terrain to the same size as the old one (While running), the scale is perfect but with 1/4 of the land covered with what I coppied and the rest flat (when I copy 1/2 of the original)

Any reason why? did I miss something? Does the GETHEIGHTS retain the information somehow of the original terrains width/height and scale when using SETHEIGHTS?

Comment
Add comment · Show 2
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image RobAnthem · Feb 22, 2018 at 12:12 AM 0
Share

This is due to height restrictions of the terrain object. Your best bet is to scale the sampled height before setting. For example.

Terrain A has a max height of 60.

Terrain B has a max height of 30

And your sample height is 45

So our calculation looks like this.

 sampleHeight * (original$$anonymous$$axHeight / new$$anonymous$$axHeight)

avatar image JForrestna · Feb 22, 2018 at 01:41 AM 0
Share

hi @RobAnthem and thanks for the reply. But I dont think was I was really that clear in my issue.

$$anonymous$$y $$anonymous$$AIN terrain is 1000x1000 in size ($$anonymous$$ountains, textures, etc) and 300 for a height. Now, Via c#, I create a new terrain in any size, this case 500x500 and 300 in height. When I copy the heightmap using the code where Size=500, X=0, Y=0 :

  TerrainData workData = new TerrainData();
  Terrain workTerrain = Terrain.CreateTerrainGameObject(workData).GetComponent<Terrain>();
  workData.heightmapResolution = sourceTerrain.terrainData.heightmapResolution;
  workData.size = new Vector3(Size, sourceTerrain.terrainData.size.y, Size); // Size
  float[,] sourceHeights = sourceTerrain.terrainData.GetHeights(X, Y, Size, Size);
  workData.SetHeights(0, 0, sourceHeights);

The returned new Terrain is sized correctly (500x500 and 300 height) and the actual HEIGHTS are correct. whats incorrect is the width and height of the heightmap when coppied. on the 500x500 new terrain created, the heightmap is CRUSHED down to only occupy the first 250x250 of the 500x500 terrain using the code above... Yet the returned sourceHeights float[,] array from the original is 500x500 in size. So why does the array, thats 500x500 in size and the new terrain, thats also 500x500 not match up when SetHeights is called? When SetHeights is called, only 1/4 of the 500x500 new terrain is changed. Now to go one step further, If I was to take this NEW terrain I created durring runtime and change its size to that of the original terrain, the 1/4 part of the new terrain would match up with the original and not be scaled/shrunk.

Confusing, no?

2 Replies

· Add your reply
  • Sort: 
avatar image
1
Best Answer

Answer by Bunny83 · Feb 22, 2018 at 03:09 AM

The "size" of the terrain only affects the world space size of the terrain object. You currently set the heightmap resolution to the same value as your original terrain. You only "scale down" the terrain. If you want a "smaller" terrain in terms of samples you have to use a lower resolution.

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users
avatar image
0

Answer by JForrestna · Feb 23, 2018 at 08:59 PM

Thank you @Bunny83 , this is the answer I was looking for. I didn't quite understand how HeightmapResolution effected the new terrain, but after some digging into it this was the culprit. I just set the Resolution to 1/2 the originals 1025 (^2 + 1 of course = 513) and it worked fine. Now, I wonder if Its possible for Unity to keep the resolution the same on the new terrain and re-sample the heightmap in a fast and efficient way to fill the terrain...

Comment
Add comment · Share
10 |3000 characters needed characters left characters exceeded
▼
  • Viewable by all users
  • Viewable by moderators
  • Viewable by moderators and the original poster
  • Advanced visibility
Viewable by all users

Your answer

Hint: You can notify a user about this post by typing @username

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this Question

Answers Answers and Comments

76 People are following this question.

avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image avatar image

Related Questions

How can I programmatically stretch a Terrain? 1 Answer

terraindata.setheight as a brush for runtime terrain editing 1 Answer

Can be terrainData.setHeights' values negative? 1 Answer

Problems with Translating Java in C# 1 Answer

Unity freezes when calling terrainData.SetHeights 2 Answers


Enterprise
Social Q&A

Social
Subscribe on YouTube social-youtube Follow on LinkedIn social-linkedin Follow on Twitter social-twitter Follow on Facebook social-facebook Follow on Instagram social-instagram

Footer

  • Purchase
    • Products
    • Subscription
    • Asset Store
    • Unity Gear
    • Resellers
  • Education
    • Students
    • Educators
    • Certification
    • Learn
    • Center of Excellence
  • Download
    • Unity
    • Beta Program
  • Unity Labs
    • Labs
    • Publications
  • Resources
    • Learn platform
    • Community
    • Documentation
    • Unity QA
    • FAQ
    • Services Status
    • Connect
  • About Unity
    • About Us
    • Blog
    • Events
    • Careers
    • Contact
    • Press
    • Partners
    • Affiliates
    • Security
Copyright © 2020 Unity Technologies
  • Legal
  • Privacy Policy
  • Cookies
  • Do Not Sell My Personal Information
  • Cookies Settings
"Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
  • Anonymous
  • Sign in
  • Create
  • Ask a question
  • Spaces
  • Default
  • Help Room
  • META
  • Moderators
  • Explore
  • Topics
  • Questions
  • Users
  • Badges