Jump to content

Перетаскивание мышью/'drag and drop'


Recommended Posts

Доброго времени суток, кто бы мог подсказать скриптовое решение и/или библиотеку для реализации мувинга объекта мышью?

Суть следующая: создается определнный замененный объект, и клиенту нужно дать возможность перетащить его (не GUI, именно 3D объект).

 

Заранее спасибо за помощь!

Link to comment
  • 2 weeks later...

Если есть готовый скрипт или библиотека, то я бы посмотрел.

Могу немного подсказать по поводу скриптового решения.

Перемещение в пространстве обьекта мышью сразу по всем осям врядли возможно, а вот по каждой оси - да. Берешь ось обьекта, берешь на ней две любые точки(например 0 - центр обьекта и 1 - на единицу дальше от обьекта по оси), вычисляешь мировые значения через матрицу(getPositionFromOffsets(matrix, 0, 1, 0)), проецируешь эти значения на экран(getScreenFromWorldPosition(x, y, z)), считаешь угол получившегося отрезка на экране через арктангенс. Далее проверяем, к чему отрезок ближе: к вертикальной прямой или к горизонтальной(это один из вариантов логики драг н дроп), в зависимости от этого вычисляем точку на экране правее/левее или выше/ниже от курсора(просто прибавляем к одной из координат курсора, например 200) - получается второй отрезок на экране, с началом в точке курсора(он будет либо горизонтальным, либо вертикальным).

Далее тебе понадобится функция для вычисления точки пересечения прямых(!причем в 3-х координатах!)(я её нашел в интернете в голом математическом виде и тупо перевёл в код). Вычисляем точку пересечения на экране прямой оси и прямой курсора(третью, Z - координату я поставил просто 0 - это, думаю, ясно). Вычисляем мировые точки полученной точки на экране(getWorldFromScreenPosition(cx, cy, 0) и getWorldFromScreenPosition(cx, cy, 1) - 0 значит точка будет в камере или почти в камере - этого я сам точно не знаю, лул; 1 - значит точка будет отдалена от камеры на 1, т.е. третий параметр это глубина). Получился отрезок в пространстве который выходит из камеры(и углом как у камеры) и длиной в 1.

И наконец финал: вычисляем точку пересечения прямой оси и полученой прямой камеры(тут нам и понадобится третья координата для той функции) - получаем новую позицию обьекта.

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


 

Edited by Jonathan.P
Link to comment
  • 5 weeks later...

@Jonathan.P, редактор есть по-умолчанию. Как таковая позиция курсора, определяется и в пространстве, достаточно посмотреть что возвращает функция.

@maximumdrive,  можно просто получать позицию курсора в пространстве и перемещать в неё. Но может понадобиться наличие коллизий у такого движения и плавность. Плавность можно получить, пересчитывая  разницу между позициями, в расстояние до новой позиции объекта, при этом задавая пропорциональный разнице velocity, но при необходимости уравнивая реальную скорость(по всем осям сразу) или же делая зависимым от скорости, можно также добавить easing к этому. С колизиями, при передвижении объекта посредством velocity, проблем особо возникнуть не должно, но если будут, то просто ограничивайте скорость вращения объекта.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...