Отслеживание перетаскивания вокруг нескольких точек поворота с помощью сенсорного ввода - PullRequest
0 голосов
/ 04 июня 2019

Предположим, что в 2D у меня есть многоугольник, состоящий из квадратных ячеек на сетке, очень похожий на тетронимо, но с произвольным числом ячеек, которые его образуют. Форма является ортогонально непрерывной, поскольку каждая ячейка соединяется, по меньшей мере, с одной другой ячейкой в ​​ортогональном направлении. Вот несколько примеров:

ShapeOverview

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

enter image description here

Я бы хотел добавить поддержку "drag-to-move". Другими словами, вы нажимаете пальцем вниз на любую точку фигуры, и , когда вы перетаскиваете и поворачиваете палец вокруг точки поворота, фигура будет вращаться вместе с ней . Моя проблема в том, что я не знаю, как програматически найти точку поворота для поворота или направление вращения по траектории одного пальца игрока.

В коде я храню список точек разворота как Vector3s. Эти Vector3s хранят следующую информацию:

X-component: x-pos of pivot
Y-component: y-pos of pivot
Z-component: -1 or 1, direction of rotation (1 for clockwise, -1 for anti-clockwise)

Для ясности Z-компонент определяет, в каком направлении можно повернуть фигуру вокруг оси, если она должна вращаться. Поэтому указанный выше GIF может содержать следующие 4 записи:

Entry #1: (0, 0, -1)
Entry #2: (0, 0, 1)
Entry #3: (2, 1, -1)
Entry #4: (2, 1, 1)

Обратите внимание на 2 записи для каждой позиции x-y в этом случае, поскольку фигуру можно вращать в обоих направлениях.

Я знаком с сенсорной системой Unity, хотя она не сильно помогает мне здесь. Я планирую использовать Transform.RotateAround (точка Vector3, ось Vector3, угол смещения) , чтобы поворачивать фигуру вокруг оси вращения и оси постепенно, каждый кадр, но я не знаю, как рассчитать, от прикосновения игрока ввод и касание позиции, которая поворачивается и под каким углом вращаться.

Я видел сообщения, как это и это (используя ввод мыши), и в то время как они были бы полезны были имею дело только с одним шарниром, я имею дело с потенциально 2 и даже 3 точки разворота. Если бы был задействован только один поворот, я мог бы попытаться проверить разность углов каждого кадра (угол между поворотом, текущим положением и положением последнего кадра) и использовать Transform.RotateAround. Так как есть два шарнира, я сначала определяю, какой круг поворачивать, а затем, возможно, вычисляю дельты угла. Однако я не знаю, как лучше было бы найти точку поворота вокруг. Есть идеи?

Извините за очень длинный пост, спасибо за любую помощь, которую вы можете предоставить! Попроси меня уточнить что-нибудь.

rbjacob

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