Понедельник, 25 Ноября 2024, 06:40

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Выпуклость
EzKekPoliceДата: Пятница, 01 Июля 2016, 05:14 | Сообщение # 1
частый гость
Сейчас нет на сайте
Подскажите функцию чтобы на плоскости отобразить такую выпуклость, как на картинке


p.s. пока что имею такую, но она не очень подходит

Код
public static float Circle(int x, int y, int size)
    {
        float d = Vector2.Distance(new Vector2(size / 2, size / 2), new Vector2(x, y));
        d /= 1000;
        return 1 - d;
    }
LertmindДата: Пятница, 01 Июля 2016, 13:42 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Это вопрос к математикам. Точную формулу не получить, из похожих с логарифмом или степенной функцией. Вот пример:
Код
    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;
    }
}



Сообщение отредактировал Lertmind - Пятница, 01 Июля 2016, 13:42
EzKekPoliceДата: Пятница, 01 Июля 2016, 20:41 | Сообщение # 3
частый гость
Сейчас нет на сайте
Lertmind, Спасибо
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг