Drag + Drop с физическим поведением - PullRequest
0 голосов
/ 07 октября 2009

Я хотел бы реализовать функцию перетаскивания, где пользователи могут перетаскивать объекты по рабочему пространству. Это, конечно, легко. Трудно сделать физически правильное перетаскивание, которое включает в себя вращение из-за крутящих моментов (представьте, что вы перетаскиваете книгу на стол одним пальцем, как она вращается при перетаскивании?).

Кто-нибудь знает, где я могу найти объяснения о том, как это кодировать (только 2D, только прямоугольники, трение не требуется)?

Очень благодарен, David


EDIT:

Я написал небольшое приложение (с явно ошибочным поведением), которое, я надеюсь, передаст то, что я ищу, гораздо лучше, чем могли бы слова. C # (VS 2008) источник и скомпилированный exe здесь


РЕДАКТИРОВАТЬ 2:

Исправлен пример проекта, чтобы дать приемлемое поведение. Новый исходный код (и скомпилированный exe) доступен здесь . Написано на C # 2008. Я предоставляю этот код без каких-либо авторских прав, не стесняйтесь использовать / изменять / что угодно. Не нужно сообщать мне или упоминать меня.

Ответы [ 3 ]

1 голос
/ 07 октября 2009

Крутящий момент - это просто приложенная сила, спроецированная перпендикулярно вектору между точкой, где сила приложена, и центром тяжести объекта. Таким образом, если вы тянете перпендикулярно диаметру, крутящий момент равен приложенному усилию. Если вы тянете прямо от центроида, крутящий момент равен нулю.

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


Я слышал много хорошего о Бурундуке как о 2D физическом пакете:

http://code.google.com/p/chipmunk-physics/


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

Основная последовательность расчетов:

  1. При наведении мыши, вы делаете свой хит-тест, и сохранить координаты событие (в координате объекта пространство).

  2. Когда мышь перемещается, вы создаете вектор, представляющий расстояние переехал.

  3. Сила, действующая на пружину, равна k * M, где M - величина расстояния между этой начальной точкой нажатия мыши от шага 1 и текущей позицией мыши. k - это постоянная пружины пружины.

  4. Проецируйте этот вектор на два вектора направления, начиная с начальной точки мыши. Одно направление - к центру объекта, другое - на 90 градусов.

  5. Сила, спроецированная к центру объекта, сместит его к курсору мыши, а другая сила - это крутящий момент вокруг оси. Степень ускорения объекта зависит от его массы, а ускорение вращения зависит от момента импульса.

  6. Трение и вязкость среды, в которой движется объект, вызывает сопротивление, которое просто уменьшает движение объекта с течением времени.


Или, может быть, вы просто хотите подделать это. В этом случае просто сохраните местоположение (x, y) прямоугольника и его текущее вращение, phi. Затем сделайте это:

  1. Захватить положение мыши в мировых координатах
  2. Когда мышь перемещается, перемещайте блок в соответствии с изменением положения мыши
  3. Рассчитать угол между мышью и центром объекта (здесь полезен atan2), а также между центром объекта и начальной точкой опускания мыши. Добавьте разницу между двумя углами к повороту прямоугольника.
1 голос
/ 07 октября 2009

Казалось бы, это основная физическая проблема.

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

Каждый элемент будет иметь такие свойства, как масса и, возможно, информация о сопротивлении воздуха, поскольку воздух поможет обеспечить движение.

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

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

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