2017-02-20 8 views
0

Все работает отлично, но я не могу найти способ реализовать столкновение.Java OpenGL 3D Collision

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

Вот моя попытка при столкновении с использованием хитбокса сеткой Контуров реальной сетки:

String[] faceName = entity.getHitboxFaces(); //Gets all the faces from the mesh****** 
Vector3f[] verts = entity.getHitboxVertices(); //Gets all the vertices****** 

//Compiles each cube into a list****** 

for (int i = 0; i < faceName.length;) { 
    List <Vector3f> tmpVerts = new ArrayList <Vector3f>(); 

    for (int z = 0; z < 6; z++) { 
     String[] currentFace = faceName[i].split(","); 
     tmpVerts.add(verts[Integer.parseInt(currentFace[0]) - 1]); 
     tmpVerts.add(verts[Integer.parseInt(currentFace[1]) - 1]); 
     tmpVerts.add(verts[Integer.parseInt(currentFace[2]) - 1]); 
     tmpVerts.add(verts[Integer.parseInt(currentFace[3]) - 1]); 
     i++; 
    } 

    xmin = 0; 
    ymin = 0; 
    zmin = 0; 
    xmax = 0; 
    ymax = 0; 
    zmax = 0; 
    //Gets the bounding boxes of each cube****** 
    for (Vector3f v: tmpVerts) { 
     if (v.x < xmin) { 
      xmin = v.x; 
     } 
     if (v.y < ymin) { 
      ymin = v.y; 
     } 
     if (v.z < zmin) { 
      zmin = v.z; 
     } 
     if (v.x > xmax) { 
      xmax = v.x; 
     } 
     if (v.y > ymax) { 
      ymax = v.y; 
     } 
     if (v.z > zmax) { 
      zmax = v.z; 
     } 
    } 
    //Scales it to the objects scale****** 
    xmin *= scale; 
    ymin *= scale; 
    zmin *= scale; 
    xmax *= scale; 
    ymax *= scale; 
    zmax *= scale; 
    //Checks if the point is in the cube****** 
    if (px >= xmin + (entity.getPosition().x) && px <= xmax + (entity.getPosition().x) && py >= ymin + (entity.getPosition().y) && py <= ymax + (entity.getPosition().y) && pz >= zmin + (entity.getPosition().z) && pz <= zmax + (entity.getPosition().z)) { 
     hit = true; 
    } 

} 

Я предпочел бы не иметь систему Hitbox так, если есть другой (рабочий) способ, скажи, пожалуйста, ,

Пример моей проблемы.

enter image description here

ответ

1

Обычно, что вы делаете, чтобы создать низкую-поли версию модели под названием столкновения сетки (но ваша модель, кажется, довольно низкий уровень пола так что он может работать, как это). Затем один из способов сделать это - использовать ray casting. Отправляйте луч (или несколько) от вашего персонажа и проверьте, не были ли они вначале

  1. Пересечение ограничивающего объема другого объекта. Это позволяет экономить более дорогостоящие расчеты.
  2. Если это так, вы увидите, пересекает ли он фактическую (столкновение) сетку.

Если raycasting недостаточно, вы можете выполнить проверку пересечения фактических сеток или ограничивающего объема против сетки. Это более дорого и сложно реализовать. Здесь, похоже, есть источник ресурсов: Object/Object Intersection