2015-02-08 3 views
1

Для каждого объекта в моей сцене OpenGL я хочу добавить BoundingBox, чтобы я мог использовать их для простого обнаружения столкновений. Для этого я создал простой класс BoundingBox так:Обнаружение столкновения OpenGL BoundingBox

public class BoundingBox 
{ 
    private float[] mathVector; 

    public float[] minVector; 
    public float[] maxVector; 

    public BoundingBox(float minX, float maxX, float minY, float maxY,float minZ, float maxZ) 
    { 
     mathVector = new float[] {0, 0, 0, 0}; 

     minVector = new float[] {minX, minY, minZ, 1}; 
     maxVector = new float[] {maxX, maxY, maxZ, 1}; 
    } 

    public void recalculate(float[] modelMatrix) 
    { 
     Matrix.multiplyMV(mathVector, 0, modelMatrix, 0, minVector, 0); 
     System.arraycopy(mathVector, 0, minVector, 0, minVector.length); 

     Matrix.multiplyMV(mathVector, 0, modelMatrix, 0, maxVector, 0); 
     System.arraycopy(mathVector, 0, maxVector, 0, maxVector.length); 
    } 

    public boolean overlap(BoundingBox bb) 
    { 
     return (maxVector[0] >= bb.minVector[0] && bb.maxVector[0] >= minVector[0]) && 
       (maxVector[1] >= bb.minVector[1] && bb.maxVector[1] >= minVector[1]) && 
       (maxVector[2] >= bb.minVector[2] && bb.maxVector[2] >= minVector[2]); 
    } 
} 

Моя проблема сейчас в том, что функция Пересчитать реально не работает. Я думал, что достаточно умножить матрицу (потому что там хранится ротация, положение и sclae) с вектором, похоже, что этого недостаточно. Что мне еще нужно сделать, чтобы выполнить перерасчет?

ответ

3

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

  • Используйте ориентированную ограничительную рамку, ее можно поворачивать, чтобы она могла отслеживать движение вашего объекта один к одному.
  • Более дорогой способ заключается в использовании выровненного в осевом направлении окна и пересчета min и max, путем преобразования вершин объекта и извлечения мин и макс каждый раз, когда объект вращается, а не только это дороже, столкновение обычно будет менее точным, поскольку ориентированный ограничивающий прямоугольник будет меньше соответствовать (зависит от формы объекта).
+0

А я думаю, я знаю, что вы имеете в виду. Итак, мне нужно, наконец, 4 очка для ориентированной ограничивающей рамки? – Cilenco

+0

@Cilenco It * can *, но когда вы поворачиваете выровненную в осевом направлении коробку, вы получите растянутую версию, * не * повернутую версию, и, следовательно, ваша ограничивающая коробка станет намного больше, чем предполагалось. Но это зависит от того, чего вы пытаетесь достичь. – concept3d

+0

@Cilenco Вам нужно хранить различную информацию, чтобы создать OBB, свою историю, и это зависит от того, какую симуляцию вы хотите достичь. http://gamedev.stackexchange.com/questions/49041/oriented-bounding-box-how-to – concept3d

3

Я делаю что-то подобное в своих играх. После преобразования каждой из 8 точек в поле min max вам нужно перепроверить, чтобы найти новый min max вдоль каждой оси.

Подумайте о min max как коробке для обуви. Новая матрица вращается и растягивает ее. После преобразования любой из 8 точек может быть новым мин или макс на любой из осей.

+0

Благодарим вас за это, конечно, вы правы. Я забыл об этом. Я реализовал его сейчас, но это не помогает. Есть ли другие ошибки или вещи, которые я забыл? – Cilenco