обнаружение столкновений не отталкивает - PullRequest
0 голосов
/ 14 декабря 2010

Хорошо, так что я работаю над обнаружением столкновений для 3d-игры, вот что я получил до сих пор:

public void mapCol(Spatial map, Node model2){
             Mesh m = (Mesh) ((Node) map).getChild("obj_mesh0");
              int c = 0;
              m.updateWorldBound(true);
              boolean col = false;
              c = m.getMeshData().getPrimitiveCount(0);
             // System.out.println(c);
              Vector3[][] v3 = new Vector3[c][3];
              for(int s = 0; s < c; s++){
                 v3[s] = null;
                 v3[s] = m.getMeshData().getPrimitive(s, 0, v3[s]);

                 Vector3 min = new Vector3((float)Math.min((float) Math.min(v3[s][0].getXf(), v3[s][1].getXf()), v3[s][2].getXf()),
                       (float)Math.min((float)Math.min(v3[s][0].getYf(), v3[s][1].getYf()), v3[s][2].getYf()),
                       (float)Math.min((float)Math.min(v3[s][0].getZf(), v3[s][1].getZf()), v3[s][2].getZf()));

                 Vector3 max = new Vector3((float) Math.max((float)Math.max(v3[s][0].getXf(), v3[s][1].getXf()), v3[s][2].getXf()),
                       (float)Math.max((float)Math.max(v3[s][0].getYf(), v3[s][1].getYf()), v3[s][2].getYf()),
                       (float)Math.max((float)Math.max(v3[s][0].getZf(), v3[s][1].getZf()), v3[s][2].getZf()));


                 Vector3 v2 = new Vector3();
                v2 = max.add(min, v2);
                v2.divideLocal(2);            

                 if(max.getXf() > model2.getTranslation().getXf() -  sp1.getRadius()&&
                    min.getXf() < model2.getTranslation().getXf() +  sp1.getRadius()  &&
                    max.getZf() > model2.getTranslation().getZf()  -  sp1.getRadius()  &&
                    min.getZf() < model2.getTranslation().getZf()  + sp1.getRadius() &&
                    max.getYf() > model2.getTranslation().getYf() + sp1.getRadius()&&
                    !col){


                    float cosine = (float) v2.dot(v2);
                      float angle = (float) Math.toDegrees(Math.acos( cosine ));
                    float pangle = (float) Math.toDegrees(Math.atan2((min.getX() + ((max.getX() - min.getX())/2)) - model2.getTranslation().getX(), (min.getZ() + ((max.getZ() - min.getZ())/2) - model2.getTranslation().getZ())));



                    if(min.getY() < max.getY()){   

                       System.out.println("pangle:" + pangle + " angle:" + angle);


                       model2.setTranslation(
                             (min.getX() + ((max.getX() - min.getX())/2)) - (Math.sin(Math.toRadians(pangle)) * (sp1.getRadius())),
                                   model2.getTranslation().getYf(),
                                   (min.getZ() + ((max.getZ() - min.getZ())/2)) -  (-Math.cos(Math.toRadians(pangle)) * (sp1.getRadius()))
                             );
                       col = true;
}
                    }
                 }     
          }

Теперь часть, на которую действительно нужно взглянуть, находится прямо здесь:

model2.setTranslation(
                             (min.getX() + ((max.getX() - min.getX())/2)) - (Math.sin(Math.toRadians(pangle)) * (sp1.getRadius())),
                                   model2.getTranslation().getYf(),
                                   (min.getZ() + ((max.getZ() - min.getZ())/2)) -  (-Math.cos(Math.toRadians(pangle)) * (sp1.getRadius()))
                             );

Есть идеи, почему бы не установить радиус model2 modle2 от стены? (заставляет его остановиться на пути и не может идти дальше)

1 Ответ

0 голосов
/ 20 января 2011
float cosine = v2.dot(v2)

намеренно?

Потому что это просто дает вам длину v2 в квадрате.

Вероятно, это должно быть

float cosine = velocity.dot(normalVector)/(velocity.length()*normalVector.length())

, если вы хотели косинус угла между ними, но я не совсем понимаю ваш код, поэтому я не знаю.

...