[Java] Проблема с обработкой коллизий.
| |
x-and1988 | Дата: Воскресенье, 21 Августа 2011, 09:41 | Сообщение # 1 |
постоянный участник
Сейчас нет на сайте
| В игре 2D с видом сверху (у меня в подписи) используются простейшая реализация коллизий через пакет awt.geom.* . Это позволяет обрабатывать столкновения, но этого не хватает для всех потребностей. В частности - при столкновении мне нужны данные о столкновении (точка соприкосновения, угол между сталкиваемыми объектами ), чтобы можно было реализовать простейшую физику - рикошеты, отталкивания от стен, и пр. С помощью awt не нашел способа находить точку соприкосновения при столкновениях. Я решаюсь на использование JBox2d, но не уверен что это оправдано. Гуру java, прошу помощи. Сам бьюсь с этой проблемой около месяца.
Изучаю Java My new project My old project
Сообщение отредактировал x-and1988 - Воскресенье, 21 Августа 2011, 11:22 |
|
| |
мотоблох | Дата: Воскресенье, 21 Августа 2011, 09:58 | Сообщение # 2 |
Придворный программист
Сейчас нет на сайте
| Ну вроде awt, как и swing, не предназначены для таких целей.
|
|
| |
x-and1988 | Дата: Воскресенье, 21 Августа 2011, 10:06 | Сообщение # 3 |
постоянный участник
Сейчас нет на сайте
| странно, а зачем тогда там пакет для работы с геометрией?
Изучаю Java My new project My old project
|
|
| |
мотоблох | Дата: Воскресенье, 21 Августа 2011, 10:13 | Сообщение # 4 |
Придворный программист
Сейчас нет на сайте
| x-and1988, для работы с компонентами интерфейсов. Да и вообще, он работает медленно.
|
|
| |
x-and1988 | Дата: Воскресенье, 21 Августа 2011, 10:54 | Сообщение # 5 |
постоянный участник
Сейчас нет на сайте
| Моего воображения не хватило, чтобы придумать, зачем интерфейсу афинные преобразования, использование кривых, эллипсов и прочей геометрии... Насчет медленности не могу сказать, ибо не пользовался другим пакетом. Для этого тему и создал - мне не хватает этого пакета, либо я что-то упустил.
Изучаю Java My new project My old project
|
|
| |
noTformaT | Дата: Воскресенье, 21 Августа 2011, 11:38 | Сообщение # 6 |
Ukrainian independent game developer
Сейчас нет на сайте
| Quote (x-and1988) странно, а зачем тогда там пакет для работы с геометрией? Вообщето для работы с геометрией, коллизия это немного другое, а физика это вообще из другой оперы. Quote (x-and1988) В частности - при столкновении мне нужны данные о столкновении (точка соприкосновения, угол между сталкиваемыми объектами ), чтобы можно было реализовать простейшую физику - рикошеты, отталкивания от стен, и пр. по сути все это есть в статьях о физике. сам пакет awt.geom.* дает тебе функции для начертательной геометрии, и некоторые методы определения коллизии между ними. Саму физику и поведение тебе надо писать самому. Насчет бокс2д. Это хороший инструмент, но он у него есть свои минусы
@noTformaT
|
|
| |
x-and1988 | Дата: Воскресенье, 21 Августа 2011, 11:46 | Сообщение # 7 |
постоянный участник
Сейчас нет на сайте
| noTformaT прошу прощения за неразбериху - тема создавалась после суточной смены на работе. Мозг кипит По сути - я использую геометрические фигуры и их функции для обработки коллизий. Физика - это гордо звучит, но немного не в ту степь. Само определение коллизий есть, и оно работает. Quote (noTformaT) Саму физику и поведение тебе надо писать самому. Вот именно с этим проблемы. Если в точности : На данный момент определяется сам факт пересечения объектов, а мне нужно определять точку пересечения, и угол между объектами, тогда я смогу написать нечто вроде формулы дял поведения объектов, исходя из величины угла, и точки пересечения. PS: какие минусы у бокс2д? зачем вот так недоговаривать
Изучаю Java My new project My old project
|
|
| |
noTformaT | Дата: Воскресенье, 21 Августа 2011, 12:01 | Сообщение # 8 |
Ukrainian independent game developer
Сейчас нет на сайте
| Quote (x-and1988) акие минусы у бокс2д? зачем вот так недоговаривать ок, договорю. Например в оригинальном бокс2д нет соединения "резинка", нет соединения "пружина" (вернее оно есть, но оно не очень сильно похоже на оригинал). Например там нет такого понятия как "частицы" и "физика частиц", все частицы в бокс2д это по сути обычные физические тела, только маленького размера, выходит что частицы рассчитываются как обычные тела. Нет много всяких фишек которые есть в других 2д физ движках. Ну, и например не всегда оправдано использование Бокс2д, например в проектах, где вам надо решить только определенную физическую задачу. Quote (x-and1988) точку пересечения, и угол между объектами, зачем вот так недоговаривать. (шучу). расскажите между чем мы вы хотите определить точку пересечения? например есть моменты когда надо узнать пересекается ли точка с прямой (лежит ли на ней), пересечение сферы со сферой, сферы с прямоугольником и т.д. Насчет угла между объектами. Мммм, есть atan2(расстояние по оси у, расстояние по оси х)
@noTformaT
Сообщение отредактировал noTformaT - Воскресенье, 21 Августа 2011, 12:02 |
|
| |
x-and1988 | Дата: Воскресенье, 21 Августа 2011, 12:26 | Сообщение # 9 |
постоянный участник
Сейчас нет на сайте
| С удовольствием постараюсь объяснить! Собственно само столкновение происходит между препятствием, в виде полигона, и объектом (танком, к примему), в виде квадрата. Стандратными средствами, методом instersects() я проверяю пересекает ли объект препятствие, и принимаю решение - ехать\ не ехать. У меня нет данных в какой именно точке происходит пересечение, и хотя бы какую линию полигона (синим цветом выделено на картике) пересекает объект. Желаемое решение при обработке столкновения - смотреть на угол между объектом и линией препятствия, и принимать решение, "рикошетить" объект от стены, или просто останавливать. Надеюсь, мою писанину возможно понять
PS: Проверка происходит с положением объекта на 1 степ позже нынешнего, правда уже не помню почему...
Изучаю Java My new project My old project
Сообщение отредактировал x-and1988 - Воскресенье, 21 Августа 2011, 12:27 |
|
| |
noTformaT | Дата: Воскресенье, 21 Августа 2011, 12:44 | Сообщение # 10 |
Ukrainian independent game developer
Сейчас нет на сайте
| Quote (x-and1988) Стандратными средствами, методом instersects() я проверяю пересекает ли объект препятствие, и принимаю решение - ехать\ не ехать. Метод узнает именно пересечение двух прямоугольников, вернее двух Rectangle. Rectangle это обычные прямоугольники, тоесть прямоугольники без поворота, на твоем рисунке видно как танк всетаки имеет угол поворота, так что пользоваться Rectangle в твоем случае не коректно. Quote (x-and1988) У меня нет данных в какой именно точке происходит пересечение Если тебе нужны точки пересечения двух прямоугольников, то http://algolist.manual.ru/maths/geom/prsh/ 8 глава, поищи там, вроде бы было. Если нужно узнать точки пересечения прямоугольника и прямой, то это называется по научному "отсечение отрезка" http://algolist.manual.ru/graphics/clip_seg.php - тут была какая та инфа Quote (x-and1988) хотя бы какую линию полигона (синим цветом выделено на картике) пересекает объект. это можно назвать "пересечением многоугольников" Тут есть куча алгоритмов: 1. Вейлера-Азертона 2. Леонова 3. Холверда 4. На основе триангуляции 5. Маргалита-Кнотта 6. Линейно - узловой http://www.inf.tsu.ru/library/Publications/2004/46.pdf
@noTformaT
|
|
| |
x-and1988 | Дата: Воскресенье, 21 Августа 2011, 20:34 | Сообщение # 11 |
постоянный участник
Сейчас нет на сайте
| Quote (noTformaT) Rectangle это обычные прямоугольники, тоесть прямоугольники без поворота, на твоем рисунке видно как танк всетаки имеет угол поворота, так что пользоваться Rectangle в твоем случае не коректно. Посмотрел свой код - при создании объекта генерируется полигон с 4 точками - тот же квадрат, только при повороте с помощью афинных преобразований я его могу поворачивать.
За информацию спасибо, буду лопатить, время для этого дела всегда найдется
Изучаю Java My new project My old project
|
|
| |
|