Алгоритм Pan Tool очень нервный - PullRequest
0 голосов
/ 28 июня 2018

Нужна небольшая помощь, чтобы увидеть, как я могу сделать этот алгоритм немного лучше. Итак, у меня есть некоторый код для инструмента панорамирования, который перемещает камеру, основываясь на том, что пользователь перетаскивает мышь для перемещения камеры. Тем не менее, это действительно нервный, если это не сделано в действительно короткие перетаскивания. То есть объекты в сцене кажутся вибрирующими, что, скорее всего, вызывает вибрацию камеры и холста, а не самих объектов.

Код работает путем переключения логического значения dragging с использованием методов SystemEvent OnPointerDown и OnPointerUp и присваивает MouseStart Vector3 в мировых координатах, а также CameraStart Vector3.

public void OnPointerDown(PointerEventData EventData)
{
    if (!dragging)
    {
        dragging = true;
        MouseStart = new Vector3(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y, 0f);
        CameraStart = TheCamera.transform.position;
    }
}

public void OnPointerUp(PointerEventData EventData)
{
    if (dragging)
    {
        dragging = false;
    }
}

Затем в цикле обновления, когда переменная dragging равна true, значения с плавающей запятой xChange и yChange определяются на основе текущего положения мыши по сравнению с исходным положением мыши, затем положение камеры регулируется в соответствии с этими , Мой мыслительный процесс заключался в том, что, поскольку он относится к фиксированному MouseStart (потому что он изменяется только в одном кадре, где указатель мыши щелкается и перетаскивается = 0), что если бы я перетащил, а затем сказал, что удерживал мышь неподвижно, не будет никаких изменений в координатах, поскольку это будет неоднократно ставить камеру в том же положении. Полный код выглядит так:

private bool dragging;

private string CurrentTool;

private ButtonController[] DrawingTools;

public Camera TheCamera;

public Vector3 MouseStart;
public Vector3 CameraStart;

public float sensitivity;

// Use this for initialization
void Start () {
    TheCamera = FindObjectOfType<Camera>();
    DrawingTools = FindObjectsOfType<ButtonController>();
}

// Update is called once per frame
void Update () {
    for (int i = 0; i < DrawingTools.Length; i++)
    {
        if (DrawingTools[i].Pressed)
        {
            CurrentTool = DrawingTools[i].gameObject.name;
        }
    }

    if (dragging && CurrentTool == "PanTool Button")
    {
        float xChange;
        float yChange;
        Vector3 MousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

        if (MousePosition.x > MouseStart.x)
        {
            xChange = -Mathf.Abs(MousePosition.x - MouseStart.x);
        }
        else
        {
            xChange = Mathf.Abs(MousePosition.x - MouseStart.x);
        }

        if (MousePosition.y > MouseStart.y)
        {
            yChange = -Mathf.Abs(MousePosition.y - MouseStart.y);
        }
        else
        {
            yChange = Mathf.Abs(MousePosition.y - MouseStart.y);
        }

        TheCamera.transform.position = new Vector3(CameraStart.x + xChange*sensitivity, CameraStart.y + yChange*sensitivity, CameraStart.z);
    }
}

public void OnPointerDown(PointerEventData EventData)
{
    if (!dragging)
    {
        dragging = true;
        MouseStart = new Vector3(Camera.main.ScreenToWorldPoint(Input.mousePosition).x, Camera.main.ScreenToWorldPoint(Input.mousePosition).y, 0f);
        CameraStart = TheCamera.transform.position;
    }
}

public void OnPointerUp(PointerEventData EventData)
{
    if (dragging)
    {
        dragging = false;
    }
}

Любая помощь приветствуется, спасибо.

РЕДАКТИРОВАТЬ: просто чтобы уточнить, это 2d окружение

1 Ответ

0 голосов
/ 29 июня 2018

Это происходит потому, что камера, с которой вы определяете мировое положение мыши, обновляется каждый кадр в соответствии с мировым положением мыши , что вызывает петлю обратной связи (и, следовательно, шум + джиттера).

Вы можете уменьшить шум от петли обратной связи, сглаживая движение камеры с течением времени (фактически, нижний проход), или попытаться полностью удалить петлю обратной связи, изменив свои вычисления, чтобы положение камеры и положение цели (мышь) не полагаться друг на друга - хотя я не уверен, как это сделать, если это действительно возможно для вашего намерения.

Проверить Vector3.SmoothDamp .

Постепенно изменяет вектор в направлении желаемой цели с течением времени.

Вектор сглаживается некоторой пружинно-демпферной функцией, которая будет никогда не превышать Чаще всего используется для сглаживания камеры слежения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...