maximumdrive Posted September 9, 2017 Share Posted September 9, 2017 Доброго времени суток, кто бы мог подсказать скриптовое решение и/или библиотеку для реализации мувинга объекта мышью? Суть следующая: создается определнный замененный объект, и клиенту нужно дать возможность перетащить его (не GUI, именно 3D объект). Заранее спасибо за помощь! Link to comment
Jonathan.P Posted September 20, 2017 Share Posted September 20, 2017 (edited) Если есть готовый скрипт или библиотека, то я бы посмотрел. Могу немного подсказать по поводу скриптового решения. Перемещение в пространстве обьекта мышью сразу по всем осям врядли возможно, а вот по каждой оси - да. Берешь ось обьекта, берешь на ней две любые точки(например 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 September 20, 2017 by Jonathan.P Link to comment
Fabervox Posted October 19, 2017 Share Posted October 19, 2017 @Jonathan.P, редактор есть по-умолчанию. Как таковая позиция курсора, определяется и в пространстве, достаточно посмотреть что возвращает функция. @maximumdrive, можно просто получать позицию курсора в пространстве и перемещать в неё. Но может понадобиться наличие коллизий у такого движения и плавность. Плавность можно получить, пересчитывая разницу между позициями, в расстояние до новой позиции объекта, при этом задавая пропорциональный разнице velocity, но при необходимости уравнивая реальную скорость(по всем осям сразу) или же делая зависимым от скорости, можно также добавить easing к этому. С колизиями, при передвижении объекта посредством velocity, проблем особо возникнуть не должно, но если будут, то просто ограничивайте скорость вращения объекта. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now