Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 07 Juillet 2009, 15:41 Message non corrigé | |
|
Super pratique, et simple pour partitionner ses maps, ce qui évite les tests de collisions inutils et autre bricoles.
<!-- o code 2e --><!-- o code -->
public class Octree {
private Octree parent;
private Octree[] enfants;
private float posX, posY, posZ, taille;
private ArrayList<Item> itemsInside;
private boolean feuille;
public Octree (float posX,float posY,float posZ, float taille) {
this.posX = posX;
this.posY = posY;
this.posZ = posZ;
this.taille = taille;
parent = this;
enfants = new Octree[8];
feuille = false;
initialiser ();
}
public void initialiser () {
//Crée l'arbre.
taille /= 2;
if (taille > Parameter.UNITE_BLOC) {
enfants[0] = new Octree (posX, posY, posZ, taille);
enfants[1] = new Octree (posX + taille, posY, posZ, taille);
enfants[2] = new Octree (posX + taille, posY, posZ + taille, taille);
enfants[3] = new Octree (posX, posY, posZ, taille);
enfants[4] = new Octree (posX, posY + taille, posZ, taille);
enfants[5] = new Octree (posX + taille, posY + taille, posZ, taille);
enfants[6] = new Octree (posX + taille, posY + taille, posZ + taille, taille);
enfants[7] = new Octree (posX, posY + taille, posZ + taille, taille);
} else {
feuille = true;
taille *= 2;
}
}
private void addItem (Item item) {
itemsInside.add(item);
}
//Place un objet dans l'arbre.
public void placerObjet (Item item) {
if (parent != null) {
for (int i = 0; i < 8; i++) {
if (enfants[i].feuille == false)
enfants[i].placerObjet (item);
else {
Vec3t centre = new Vec3t (posX + taille / 2, posY + taille/2, posZ + taille/2);
AxisAlignedBoundingBox aabb = new AxisAlignedBoundingBox(centre, taille, taille, taille);
if (aabb.isInside(item.getPositions().getVec3t()[0], item.getPositions().getVec3t()[1], item.getPositions().getVec3t()[2]))
addItem (item);
}
}
}
}
public String toString () {
return "Pos x : "+posX+" pos y : "+posY+" pos z : "+posZ+" taille : " + taille+" feuille : " + feuille + "\n";
}
}
<!-- f code --><!-- f code 2e -->
L'avantage est que l'on peut faire les tests de collision uniquement dans les octrees qui sont en face du rayon de la caméra et derrière aussi. (le rayon c'est tout simplement entre lookAt et la position du joueur)
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|