lentinant | Дата: Среда, 23 Апреля 2014, 21:39 | Сообщение # 1 |
ленивый программист
Сейчас нет на сайте
| Подскажите, как можно реализовать простую коллизию в чистом C# (для объектов, нарисованных с помощью GDI+), желательно, без итерации по всем объектам на уровне. Пока у меня единственная идея - представление простых коллайдеров в виде уравнений геометрических фигур, и проверка соответственных уровнений на наличие общей точки (хотя, тут тоже нужна итерация).
Когда-то тут будут ссылки на крутые проекты. Или нет.
|
|
| |
Storm54 | Дата: Четверг, 24 Апреля 2014, 03:05 | Сообщение # 2 |
постоянный участник
Сейчас нет на сайте
| Вполне себе приемлемый вариант - представить тело объекта в виде точек, которые будут соединяться в отрезки. Коллизии проверять посредством пересечения отрезков. Я реализовывал такой механизм - работает довольно шустро при большом количестве объектов(в несколько сотен, а то и тысяч), расставленных по всей карте. Однако, здесь нужно грамотно подойти к оптимизации. Перебирать все отрезки - очень медленно и убьет FPS мгновенно. Поэтому первое, что нужно сделать: рассчитывать Bounding Box тела и проверять пересечения тела сначала с ним, а потом уже при необходимости(если пересекается с боксом) проверять пересечение с отрезками. В больших мирах такой оптимизации так же будет недостаточно, т.к. перебирать все-равно придется все боксы. Единственный вариант - поделить мир на огромные мета-боксы, в которые занести все объекты попадающие в этот Bounding Box и сначала проверять пересечение объекта со всеми соседними мета-боксами, включая и тот, в котором находится сам объект, а потом уже проверять пересечения уже с bounding box'ами каждого объекта, включенного в мета-бокс.
В одной из тем я скидывал демку 2Д танков, в которых можно посмотреть этот механизм в действии. Кстати, все движения и повороты я считал с помощью тригонометрических функций, но все-равно все работало очень быстро. Если просчитывать скажем с помощью матриц, то можно получить еще больший плюс к производительности. Мой пост с демкой
Сообщение отредактировал Storm54 - Четверг, 24 Апреля 2014, 03:24 |
|
| |