3D网格碰撞Java

时间:2014-07-18 22:32:05

标签: java 3d lwjgl collision mesh

我似乎无法让3D碰撞正常工作,当我运行我的引擎时,它认为我总是碰撞某些东西。以下是发生碰撞时执行某些操作的循环。

Camera cam = new Camera();
Obj obj = new Obj();
Collision c = new Collision(obj);

for(int i=0;i<obj.triangles.size();i+=3) {
   if(c.triPntCol(obj.triangles.get(i), obj.triangles.get(i+1),obj.triangles.get(i+2), new Vector3f(cam.x,cam.y,cam.z))==true){
      cam.x=cam.px;
      cam.y=cam.py;
      cam.z=cam.pz;
   }
}

以下是碰撞类的方法。

public boolean triPntCol(Vector3f a,Vector3f b,Vector3f c,Vector3f p ){//Triangle point collision.

    Vector3f v0=new Vector3f(c.x-a.x,c.y-a.y,c.z-a.z);
    Vector3f v1=new Vector3f(b.x-a.x,b.y-a.y,b.z-a.z);
    Vector3f v2=new Vector3f(p.x-a.x,p.y-a.y,p.z-a.z);

    float dot00= (v0.x*v0.x)+(v0.y*v0.y)+(v0.z*v0.z);
    float dot01= (v0.x*v1.x)+(v0.y*v1.y)+(v0.z*v1.z);
    float dot02= (v0.x*v2.x)+(v0.y*v2.y)+(v0.z*v2.z);
    float dot11= (v1.x*v1.x)+(v1.y*v1.y)+(v1.z*v1.z);
    float dot12= (v1.x*v2.x)+(v1.y*v2.y)+(v1.z*v2.z);

    float inv=1/((dot00*dot11)-(dot01*dot01));

    float u=((dot11*dot02)-(dot01*dot12))*inv;
    float v=((dot00*dot12)-(dot01*dot02))*inv;

    if(u>=0 && v>=0 && u+v<1){
        return true;
    }
    else return false;
}

最后这里是加载3D模型的代码。

public List<Vector3f> v = new ArrayList<Vector3f>();
public List<Vector3f> vn = new ArrayList<Vector3f>();
public List<Vector2f> vt = new ArrayList<Vector2f>();
public List<Face> face = new ArrayList<Face>();

public ArrayList color = new ArrayList<>();
public ArrayList colorFace = new ArrayList<>();

public ArrayList<Vector3f> triangles = new ArrayList<Vector3f>();

public Texture texture;


public Obj(){

}

public void load(File f,File mtl) throws IOException{//Gets data from obj and mtl files.
    BufferedReader reader = new BufferedReader(new FileReader(f));
    BufferedReader reader2 = new BufferedReader(new FileReader(mtl));
    String line;
    String line2;
    String tag=null;
    String tag2=null;
    while((line = reader.readLine()) !=null){
        if(line.startsWith("v ")){
            float x = Float.valueOf(line.split(" ")[1]);
            float y = Float.valueOf(line.split(" ")[2]);
            float z = Float.valueOf(line.split(" ")[3]);
            v.add(new Vector3f(x,y,z));
        }
        else if(line.startsWith("vn ")){
            float x = Float.valueOf(line.split(" ")[1]);
            float y = Float.valueOf(line.split(" ")[2]);
            float z = Float.valueOf(line.split(" ")[3]);
            vn.add(new Vector3f(x,y,z));    
        }
        else if(line.startsWith("vt ")){
            float x = Float.valueOf(line.split(" ")[1]);
            float y = Float.valueOf(line.split(" ")[2]);
            vt.add(new Vector2f(x,1-y));

        }
        else if (line.startsWith("f ")){
            Vector3f vIndices = new Vector3f(Float.valueOf(line.split(" ")[1].split("/")[0]),Float.valueOf(line.split(" ")[2].split("/")[0]),Float.valueOf(line.split(" ")[3].split("/")[0]));
            Vector3f nIndices = new Vector3f(Float.valueOf(line.split(" ")[1].split("/")[2]),Float.valueOf(line.split(" ")[2].split("/")[2]),Float.valueOf(line.split(" ")[3].split("/")[2]));
            Vector3f tIndices = new Vector3f(Float.valueOf(line.split(" ")[1].split("/")[1]),Float.valueOf(line.split(" ")[2].split("/")[1]),Float.valueOf(line.split(" ")[3].split("/")[1]));

            face.add(new Face(vIndices,nIndices,tIndices,texture.getTextureID()));
            colorFace.add(tag);
            colorFace.add(Float.valueOf(line.split(" ")[1].split("/")[0]));
            colorFace.add(Float.valueOf(line.split(" ")[2].split("/")[0]));
            colorFace.add(Float.valueOf(line.split(" ")[3].split("/")[0]));
        }
        else if (line.startsWith("usemtl ")){
            //use what follows usemtl as a tag 
                tag = line.split(" ")[1];


            //System.out.println(tag);
            while((line2 = reader2.readLine()) !=null){
             if (line2.startsWith("newmtl ")){
                 tag2 = line2.split(" ")[1];
             }

            else if(line2.startsWith("Kd ")){

                    float x = Float.valueOf(line2.split(" ")[1]);
                    float y = Float.valueOf(line2.split(" ")[2]);
                    float z = Float.valueOf(line2.split(" ")[3]);
                    color.add(tag2);
                    color.add(x);
                    color.add(y);
                    color.add(z);

                }

            else if(line2.startsWith("map_Kd ")){
                texture = TextureLoader.getTexture("JPG", ResourceLoader.getResourceAsStream("res/"+line2.split(" ")[1]/*.split("\\\\")[10]*/)); 
                    System.out.println(line2.split(" ")[1]/*.split("\\\\")[6]*/);

                }

            }
        }

    }
    reader.close(); 
    reader2.close();

}

0 个答案:

没有答案