В последнее время я исследовал всевозможные причудливые алгоритмы обнаружения столкновений и деревья квадрантов для двумерного приложения, и мое приложение находится в той точке, где я хочу начать реализацию этих алгоритмов столкновений. Мой игровой цикл способен вычислять Δt мои кадры, и я хочу выполнить «интерполяционные» проверки столкновений между нарисованными кадрами (в отличие от метода «грубой силы»: рисовать как можно быстрее, что приводит к общему снижению производительности и качества анимации).
Итог
Каков наиболее эффективный способ реализации «интерполяционных» проверок столкновений и, кроме того, существуют ли какие-либо алгоритмы столкновений, которые могут просто учитывать Δt и скорость для выполнения интерполяции за меня?
Дополнительные размышления и информация
Я использую пересечение пикселей на изображениях после AABB в дереве квадрантов. Изображения по своей сути выражаются в виде прямоугольников, и я считаю слишком неэффективным вычислять выпуклые/вогнутые многоугольники вокруг пикселей изображения, которые соответствуют определенному порогу альфа-прозрачности, а затем выполнять какой-либо другой алгоритм, такой как уточнение портала Минковского или рекурсивные круги. Я выбираю попиксельно, несмотря на то, что это неэффективно с точки зрения скорости из-за прямоугольной ограниченной формы изображений (зная это, я уменьшаю количество проверок на пиксель, обертывая проверку проверкой столкновений AABB). В будущем я мог бы попытаться повторно оптимизировать/использовать метод, отличный от AABB, потому что мои изображения будут вращаться под разными углами.
Код игрового цикла: где update() обрабатывает догоняющие операции.
currentUpdateTime = System.nanoTime();
while(true) {
beginLoopTime = System.nanoTime();
drawPanel.repaint();
lastUpdateTime = currentUpdateTime;
currentUpdateTime = System.nanoTime();
update((int) ((currentUpdateTime - lastUpdateTime)/( Math.pow(10,-9) )));//1000*1000
endLoopTime = System.nanoTime();
deltaLoop = endLoopTime - beginLoopTime;
if(deltaLoop <= desiredDeltaLoop) {
try {
/*Refer to: 'http://stackoverflow.com/questions/1036754/difference-between-wait-and-sleep'
on differences between Thread.sleep() and wait()*/
wait((long) ((desiredDeltaLoop - deltaLoop)/( Math.pow(10,-6) )));
} catch(InterruptedException e) {
e.printStackTrace(System.out);
}
}
}