- Home /
Question by
Ellie97 · Jul 24, 2018 at 06:25 AM ·
terrainmobilescalingterraindata
Terrain scaling at runtime
Hello. I'm developing a mobile app with includes a small 3D environment with a terrain which has some details (i.e. grass, flowers). I have scaling working with a simple +/- button with predetermined scales, but my client would rather scale by pinching. After a lot of maths, I thought I had it figured out but apparently not, and it also destroys my framerate. Is there some simple method I'm missing for scaling terrain with details that I'm missing?
//SCALING BY PINCHING
if (Input.touchCount == 2)
{
Touch touch0 = Input.GetTouch(0);
Touch touch1 = Input.GetTouch(1);
Vector2 touch0pos = touch0.position - touch0.deltaPosition;
Vector2 touch1pos = touch1.position - touch1.deltaPosition;
float prevTouchDeltaMag = (touch0pos - touch1pos).magnitude;
float touchDeltaMag = (touch0.position - touch1.position).magnitude;
scale_momentum = prevTouchDeltaMag - touchDeltaMag;
transform.localScale = new Vector3(
Mathf.Clamp(transform.localScale.x, minimumScale, maximumScale),
Mathf.Clamp(transform.localScale.y, minimumScale, maximumScale),
Mathf.Clamp(transform.localScale.z, minimumScale, maximumScale));
if (transform.localScale.magnitude >= minimumScale && transform.localScale.magnitude <= maximumScale)
{
terrain.terrainData.size = new Vector3(
transform.localScale.x * 6,
transform.localScale.y * 0.925f,
transform.localScale.z * 6);
for (int i = 0; i < details.Length; i++)
{
details[i].maxHeight = (transform.localScale.magnitude / 36) - 0.0155f;
details[i].minHeight = (transform.localScale.magnitude / 36) - 0.0155f;
details[i].maxWidth = (transform.localScale.magnitude / 36) - 0.0155f;
details[i].minWidth = (transform.localScale.magnitude / 36) - 0.0155f;
}
terrain.terrainData.detailPrototypes = details;
}
}
//SCALING BY PRESSING A BUTTON
public void ScaleUp()
{
if (scaleFactor < 2)
{
scaleMultiplier = 1.5f;
ButtonScaling();
scaleFactor++;
}
}
public void ScaleDown()
{
if (scaleFactor > 0)
{
scaleMultiplier = 0.66666f;
ButtonScaling();
scaleFactor--;
}
}
void ButtonScaling()
{
transform.localScale *= scaleMultiplier;
terrain.terrainData.size *= scaleMultiplier;
for (int i = 0; i < details.Length; i++)
{
details[i].maxHeight *= scaleMultiplier;
details[i].minHeight *= scaleMultiplier;
details[i].maxWidth *= scaleMultiplier;
details[i].minWidth *= scaleMultiplier;
}
terrain.terrainData.detailPrototypes = details;
}
Comment