碰撞检测不会推迟

时间:2010-12-13 22:20:18

标签: java math vector 3d collision-detection

好吧,所以我正在为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 :(得分:0)

float cosine = v2.dot(v2)

是故意的?

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

可能应该是

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

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