2010-12-13 68 views
0

Bon,:détection de collision ne je travaille sur la détection de collision pour un jeu en 3D, ce que je suis arrivé à ce jour repousse pas

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; 
} 
        } 
       }  
      } 

Maintenant, la partie de regarder vraiment est ici :

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())) 
          ); 

Toute idée pourquoi il ne fixerait pas le rayon de model2 modle2 loin du mur? (ce qui l'arrête au passage et ne peut pas aller plus loin)

+0

Reformatez votre code s'il vous plaît. – I82Much

+0

Que voulez-vous dire? – William

+0

Si vous voulez que quelqu'un essaie de résoudre cela, dites-nous 1) ce que ce morceau de code est censé faire, 2) ce qu'il fait réellement, et 3) que vous avez testé ces cinq lignes et pas seulement deviné. – Beta

Répondre

0
float cosine = v2.dot(v2) 

est intentionnel?

Parce que cela vous donne juste la longueur de v2, au carré.

Probablement que devrait être

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

, si vous vouliez cosinus de l'angle entre eux, mais je ne comprends pas bien votre code, donc je ne sais pas.