Это вопрос к математикам. Точную формулу не получить, из похожих с логарифмом или степенной функцией. Вот пример:
Код
public static float Circle(int x, int y, int size)
{
float d = Vector2.Distance(new Vector2(size / 2, size / 2), new Vector2(x, y));
float radius = size / 2f;
d = radius * 0.8f - d;
d = Mathf.Clamp(d, 0f, radius * 0.7f);
d = Mathf.Pow(d * 6, 0.6f);
return d;
}
В Unity лучше использовать AnimationCurve, если объявить поле в скрипте этого типа, то через Инспектор можно будет задать кривую, а в коде использовать метод Evaluate, чтобы определять любое сечение купола.
Добавлено (01 июля 2016, 13:42)
---------------------------------------------
Если интересно, вот так использовал AnimationCurve:
Код
using UnityEngine;
public class Deformation : MonoBehaviour
{
public AnimationCurve Curve;
void Start()
{
Mesh mesh = GetComponent<MeshFilter>().mesh;
Vector3[] vertices = mesh.vertices;
for (int i = 0; i < vertices.Length; i++) {
var v = vertices[i];
float z = Circle((int)v.x, (int)v.y, 100);
vertices[i] += new Vector3(0f, 0f, z);
}
mesh.vertices = vertices;
mesh.RecalculateNormals();
}
public float Circle(int x, int y, int size)
{
float d = Vector2.Distance(new Vector2(size / 2, size / 2), new Vector2(x, y));
float radius = size / 2f;
float maxDistance = radius * 0.8f;
d = maxDistance - d;
d = Mathf.Max(0f, d);
d = maxDistance * Curve.Evaluate(d / maxDistance);
return d;
}
}