2010-12-13 100 views
0

好了,所以我工作的碰撞检测的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())) 
          ); 

任何想法为什么它不会设置模型2的模型2的半径远离墙? (使其停下来并能够不再进行)

+0

请重新格式化您的代码。 – I82Much 2010-12-13 23:06:12

+0

你是什么意思? – William 2010-12-13 23:17:36

+0

如果你想要别人试图解决这个问题,告诉我们1)代码应该做什么,2)它实际上做了什么,3)你已经测试了这五条线,而不仅仅是猜测。 – Beta 2010-12-14 07:26:11

回答

0
float cosine = v2.dot(v2) 

是故意的吗?

因为它只是给你v2的长度,平方。

也许这应该是

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

,如果你想他们之间的夹角余弦,但我不完全理解你的代码,所以我不知道。