2010-12-13 119 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()) 

,如果你想他們之間的夾角餘弦,但我不完全理解你的代碼,所以我不知道。