2015-07-19 6 views
1

Я пытаюсь сделать 3D-игру, но мне сложно с ней столкнуться. Я работал над системой, но это не очень хорошо. У меня уже есть система для столкновения с ландшафтом, но она не может использоваться для столкновения с сущностями (так как у местности есть только высота, с которой она сталкивается). Я использую blender-models, и они состоят из треугольников. 100% точное столкновение будет заключаться в использовании какой-либо формы обнаружения столкновений для каждого треугольника, но их так много, и поэтому игра потеряет свою производительность. Большая часть кода основана на учебнике ThinMatrix на YouTube, за исключением некоторых из них, которые я создал сам. Вот некоторые из кода, который я использую для текущего столкновения:LWJGL Java collision

public boolean collision(Entity e1, Entity e2){ 


    if(e1.getPosition().x >= e2.getPosition().x && e1.getPosition().x < e2.getPosition().x + e2.getWidth()){ 
     if(e1.getPosition().z >= e2.getPosition().z && e1.getPosition().z < e2.getPosition().z + e2.getWidth()){ 
      System.out.println("XXX||&&&||ZZZ"); 
      return true; 
     } 
    } 

    return false; 


} 

Этот метод является методом столкновения. Он основан на положениях X и Z и поэтому очень неточен. В играющим классе, я называю это:

public void tick(){ 
     for(Entity e : entities){ 
      if(super.collsion(this, e)){ 
       I haven't gotten to this 
      } 

     } 
    } 

Эта система работает, но он имеет очень много проблем, одна из них в том, что она является неточной.

EDIT: Я работаю над использованием нового вектора (который я сделал), который я назвал Vector6f. Используя несколько значений, нужно сохранять и получать значения. Он принимает параметры x, y, z, xwidth, zwidth, height. С этим я создал новый метод, который я назвал getBounds, который возвращает границы сущностей. если у объекта нет границ, он не будет совершать столкновений

ответ

2

Вы можете легко принести значение Y в чек, вы должны сделать его более точным. Хотя это просто создает трехмерный ограничивающий прямоугольник вокруг объекта, а не 3d выпуклый корпус, который, вероятно, следует использовать. Вот несколько псевдокодов, близких к java, где lX - length in X axis, hlX - half length in X axis, учитывая, что мы используем центральную точку сущностей, чтобы определить их положение.

boolean isColliding(Entity other) { 
if (center.y + hlY < other.center.y - other.hlY || 
    center.y - hlY > other.center.y + other.hlY) 
    return false; 

Rectangle r1 = { center.x - hlX, center.z - hlZ, lX, lZ }; 
Rectangle r2 = { other.center.x - other.hlX, other.center.z - other.hlZ, other.lX, other.lZ }; 

return r1.intersects(r2); 
} 

Что касается клеща обновления о столкновениях:

for (int i = 0; i < collidables.size(); i++) { 
     Entity e1 = collidables.get(i); 

     for (int j = i + 1; j < collidables.size(); j++) { 
      Entity e2 = collidables.get(j); 

      if (e1.isColliding(e2)) { 
       CollisionHandler handler = ... // get handler if registered for type of e1 vs type of e2 
       if (handler != null) 
        handler.onCollision(e1, e2); 
      } 
     } 
    } 

, который дает вам п * (п - 1)/2 циклов цикла, где п - число collidable субъектов

+0

я не имею вычислил центр xy и z. Как это делается? –

+0

У меня нет опыта работы с LWJGL, но он должен рисовать объекты из центральной точки. Следовательно, мировой перевод объекта должен быть центральной точкой для этого объекта. Постскриптум Почему бы вам не использовать настоящий игровой движок, например, JMonkey построен поверх LWJGL и имеет значительно больше возможностей, в том числе физический движок, который выполняет коллизии для вас. – AlmasB

+0

Я работал некоторое время, открывая координаты XYZ и Я пришел к этому соглашению; Я не могу так. начальные координаты XYZ (0,0,0) начинаются в одном и том же положении, назад влево слева. Из-за всех этих факторов я решил сделать что-то, даже если не писал, когда писал это сообщение; Я собираюсь создать новый вектор. Vector6f примет эти параметры: x, y, z, xwidth, zwidth, height. У этого есть некоторые методы, которые заменяют всю бессмыслицу в моем первом сообщении. он также позволяет игроку войти в единый объект, состоящий из 2-х Vector6f. Тем не менее, WIP. –