Реализация одновременно свапа двумя пальцами и зуума

Программирование на Юнити.

Реализация одновременно свапа двумя пальцами и зуума

Сообщение Susanin 20 сен 2017, 22:36

Собственно говоря что-то не получается корректно различить где свап, а где зуум.
Может кто уже реализовывал нечто подобное?


З.Ы. И её маё - это только у меня Заголовок: наезжает на Значок: при создании темы?
Susanin
UNIт
 
Сообщения: 120
Зарегистрирован: 11 дек 2015, 10:52

Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение Tolking 20 сен 2017, 23:24

Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2715
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение Susanin 23 сен 2017, 13:31

Tolking писал(а):Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.

Спасибо кэп!

Меня интересует рабочий вариант их одновременной реализации, что бы без конфликтов, ибо программа не может понять где граница между свапом и зуумом.
Susanin
UNIт
 
Сообщения: 120
Зарегистрирован: 11 дек 2015, 10:52

Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение Левш@ 24 сен 2017, 10:48

Дык свайп - это один тач, а зум как минимум два, не ?
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение Susanin 27 сен 2017, 00:18

Левш@ писал(а):Дык свайп - это один тач, а зум как минимум два, не ?


нет - меня именно интересует реализация свапа двумя пальцами и зума (свап одним уже задействован).
Не могу подобрать критерий по которому программа бы распознала где начинается свап, а где зумм...
Susanin
UNIт
 
Сообщения: 120
Зарегистрирован: 11 дек 2015, 10:52

Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение Левш@ 27 сен 2017, 10:23

Ну тогда вам уже правильно написали выше:
Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт


Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение Susanin 27 сен 2017, 23:07


Эээх - где вы были раньше с этим ассетом?

Сейчас мне уже проще самому такую программу написать нежели в чужой разбираться.

И да, я так не обнаружил в примерах мой случай. Может плохо искал?


Левш@ писал(а):Ну тогда вам уже правильно написали выше:
Свайп - изменение положения середины между тачами.
Зум - растояние между тачами.


Нет - тут нет ответа на вопрос как их различить.
Вот часть кода отвечающая за обработку касания двумя пальцами:
(определение того что сейчас зумм или свап определяется изменением расстояния между пальцами
на критическую величину zoomshift: if (Math.Abs(tap2FingerCurrentZoom - tap2FingerStartZoom) < zoomShift)
Как вы понимаете код работает некорректно и я спрашиваю сталкивался ли кто с подобной реализацией.
Синтаксис:
Используется csharp
       
            if (finger2 && Input.touchCount == 2)
            {
                touch = Input.touches[0];
                touch1 = Input.touches[1];
                if (touch1.phase == TouchPhase.Began)
                {
                    tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                    tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                    Messenger<Vector2>.Broadcast(EVENTS.TapStart2Finger, tap2FingerStartPos);
                }

                if (touch.phase == TouchPhase.Moved || touch1.phase == TouchPhase.Moved)
                {
                    tap2FingerCurrentZoom = Vector2.Distance(touch.position, touch1.position);
                    tap2FingerCurrentPosition = (touch.position + touch1.position) * 0.5f;

                    if (Math.Abs(tap2FingerCurrentZoom - tap2FingerStartZoom) < zoomShift)
                    {
                        if (is1FingerWasActive || is3FingerWasActive)
                        {
                            tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                            tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position); ResetFingers();
                        }
                        displasement2Finger = (touch.deltaPosition + touch1.deltaPosition) * 0.5f;
                        if (Mathf.Abs(displasement2Finger.y) < Mathf.Abs(displasement2Finger.x))
                        {
                            if (is2FingerWasVertical || is2FingerWasZoom)
                            {
                                tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                                tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                                ResetFingers();
                            }
                            else if (finger2Horizontal)
                            {
                                displasement2Finger.y = 0;
                                Messenger<Vector2>.Broadcast(EVENTS.TapHorisontalMove2Finger, displasement2Finger);
                                is2FingerWasHorizontal = true;
                            }
                        }
                        else
                        {
                            if (is2FingerWasHorizontal || is2FingerWasZoom)
                            {
                                tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                                tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                                ResetFingers();
                            }
                            else if (finger2Vertical)
                            {
                                displasement2Finger.x = 0;
                                Messenger<Vector2>.Broadcast(EVENTS.TapVerticalMove2Finger, displasement2Finger);
                                is2FingerWasVertical = true;
                            }
                        }

                    }
                    if (finger2Zoom && Math.Abs(tap2FingerCurrentZoom - tap2FingerStartZoom) > zoomShift)
                    {
                        if (is2FingerWasVertical || is2FingerWasHorizontal)
                        {
                            tap2FingerStartPos = (touch.position + touch1.position) * 0.5f;
                            tap2FingerStartZoom = Vector2.Distance(touch.position, touch1.position);
                            ResetFingers();
                        }
                        float disp = Math.Abs(touch.deltaPosition.magnitude) + Math.Abs(touch1.deltaPosition.magnitude);
                        Messenger<float>.Broadcast(EVENTS.Tap2FingerZOOM, disp * 0.001f);
                        //tap2FingerStartZoom = tap2FingerCurrentZoom;
                        is2FingerWasZoom = true;
                    }

                }
            }
        }

 
Susanin
UNIт
 
Сообщения: 120
Зарегистрирован: 11 дек 2015, 10:52

Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение bojlahg 28 сен 2017, 11:03

Замерять расстояние между тачами и расстояние средней точки между тачами. Когда одно из значений перейдет определенную границу то соответственно переключаться на его обработку. Причем логично сделать перевод пикселей в дюймы через DPI чтобы на разных устройствах паботало одинаково.
Мои проекты: MahJah Star Factory Cop Car Swash! Spline Editor
Аватара пользователя
bojlahg
UNIверсал
 
Сообщения: 392
Зарегистрирован: 13 авг 2011, 10:57
Откуда: Сатка
Skype: bojlahg
  • Сайт

Re: Реализация одновременно свапа двумя пальцами и зуума

Сообщение Susanin 28 сен 2017, 17:35

bojlahg писал(а):Замерять расстояние между тачами и расстояние средней точки между тачами. Когда одно из значений перейдет определенную границу то соответственно переключаться на его обработку. Причем логично сделать перевод пикселей в дюймы через DPI чтобы на разных устройствах паботало одинаково.

Если поставить два таких условия - то постоянно будет возникать ситуация, когда одновременно активируется и свап и зумм.

Возможно как критерий стоит взять отношение их относительных изменений...
Susanin
UNIт
 
Сообщения: 120
Зарегистрирован: 11 дек 2015, 10:52


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 18