| Truc pas mal |
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 15 Juin 2009, 00:06 Message non corrigé | |
|
En fait en me renseignant j'ai trouver deux types d'algorithmes pour gérer les collisions avec les box, ça dépends si les box sont toujours alignées dans le même sens par rapport aux axes x, y et z ou alors si elle sont orientée n'importe comment.
Dans le premier cas, c'est simple, on doit faire un test de collision AABB (Axis Aligned Bounding Box.)
On fait il suffit d'avoir le centre de la boîte et le milieu de chaque arrête de la boîte, enfin je mettrai l'algo final et expliquerai quand j'aurai terminé.
(C'est moins complexe je trouves que le lien que tu m'a donné David.)
Pour le cas n°2 ce sont des OBB (Oriented Bouding Bos.) pour faire simple il suffit de stocker les deux angles têta et rho de la boîte, prendre l'inverse de la transformation pour ensuite pouvoir faire le même test que pour les AABB.
Voilà, je suis content j'ai enfin trouvé un truc qui 'ma l'air simple et qui me plait bien pour la suite de mes tutos.
Une fois ceci fait je n'aurai plus qu'à placer des objets dans mes blocs.
J'ai fait une classe bloc dans laquelle je peut mettre des objets, n'importe lesquels, je penses que c'est le plus simple.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 29 Juin 2009, 21:05 Message non corrigé | |
|
Voilà, la direction est bonne, j'ai la bonne face de sélectionnée, mais l'intersection, je n'ai pas encore trouvé, là je n'ai pas encore les bonnes valeurs, mais ça va venir, prochaines étape, l'utilisation de la souris et de gluUnProject.
Aller j'ai presque finis la sélection, après reste la modifiction.
En fait je compte présenter (mon projet une fois finis) à un studio qui développe des jeux vidéos car à l'école ça ne marche pas for fort, histoire d'être recruté facilement.
Donc après je remettrai le jeux en c++, je n'aurais pas de mal car une fois fait en java, suffit de transcrire.
public boolean intersects (Ray ray) {
float tFar = Float.MAX_VALUE;
float tNear = -Float.MAX_VALUE;
int axe = 0;
boolean devant = false;
Vec3t d = new Vec3t(0, 0, 0);
for (int i = 0; i < 3; i++) {
float milieu, orig;
switch (i) {
case 0 :
milieu = milieuX;
d.getVec3t()[0] = ray.getDest().getVec3t()[0] - ray.getOrig().getVec3t()[0];
orig = ray.getOrig().getVec3t()[0] - centre.getVec3t()[0];
break;
case 1 :
milieu = milieuY;
d.getVec3t()[1] = ray.getDest().getVec3t()[1] - ray.getOrig().getVec3t()[1];
orig = ray.getOrig().getVec3t()[1] - centre.getVec3t()[1];
break;
default :
milieu = milieuZ;
d.getVec3t()[2] = ray.getDest().getVec3t()[2] - ray.getOrig().getVec3t()[2];
orig = ray.getOrig().getVec3t()[2] - centre.getVec3t()[2];
}
if (d.getVec3t()[i] == 0) {
if (Math.abs(orig) > milieu)
return false;
} else {
float t1 = (-milieu - orig) / d.getVec3t()[i];
float t2 = (milieu - orig) / d.getVec3t()[i];
float tmp;
if(t1>t2){
tmp = t1;
t1 = t2;
t2 = tmp;
} else
tmp = t1;
if (t1 > tNear) {
axe = i;
tNear = t1;
devant = tmp != t1;
}
if (t2 < tFar) {
tFar = t2;
}
// on prend le plus grand t1 et le plus petit t2, et si t1 > t2, c'est que
// la droite rencontre la face droite avant la face gauche, et donc n'est pas dans
// la boite.
if (tNear > tFar)
return false;
// (a uniquement mettre si ton rayon est orienté (si le cube ne peut pas être derrière l'origine du rayon))
// si l'intersection à lieu avant l'origine
if (tFar < 0)
return false;
}
}
intersection = ray.getOrig().translation(tNear, true, true, true);
switch (axe) {
case 0 :
//intersection = ray.getOrig().translation(tNear * Parameter.RAY, true, false, false);
if (devant)
orientation = OrientationRayon.DROITE;
else
orientation = OrientationRayon.GAUCHE;
break;
case 1 :
//intersection = ray.getOrig().translation(tNear * Parameter.RAY, false, true, false);
if (devant)
orientation = OrientationRayon.HAUT;
else
orientation = OrientationRayon.BAS;
break;
default :
//intersection = ray.getOrig().translation(tNear * Parameter.RAY, true, false, false);
if (devant)
orientation = OrientationRayon.DEVANT;
else
orientation = OrientationRayon.DERRIERE;
break;
}
return true;
}
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 30 Juin 2009, 08:53 Message non corrigé | |
|
Et voilà l'algo pour déterminer l'intersection entre le Bloc (Aligné par rapport aux axes.) et le rayon marche!
public boolean intersects (Ray ray) {
float tFar = Float.MAX_VALUE;
float tNear = -Float.MAX_VALUE;
int axe = 0;
boolean devant = false;
Vec3t d = new Vec3t(0, 0, 0);
for (int i = 0; i < 3; i++) {
float milieu, orig;
switch (i) {
case 0 :
milieu = milieuX;
d.getVec3t()[0] = ray.getDest().getVec3t()[0] - ray.getOrig().getVec3t()[0];
orig = ray.getOrig().getVec3t()[0] - centre.getVec3t()[0];
break;
case 1 :
milieu = milieuY;
d.getVec3t()[1] = ray.getDest().getVec3t()[1] - ray.getOrig().getVec3t()[1];
orig = ray.getOrig().getVec3t()[1] - centre.getVec3t()[1];
break;
default :
milieu = milieuZ;
d.getVec3t()[2] = ray.getDest().getVec3t()[2] - ray.getOrig().getVec3t()[2];
orig = ray.getOrig().getVec3t()[2] - centre.getVec3t()[2];
}
//Si la droite est parallèle à la boîte.
if (d.getVec3t()[i] == 0) {
if (Math.abs(orig) > milieu)
return false;
} else {
float t1 = (-milieu - orig) / d.getVec3t()[i];
float t2 = (milieu - orig) / d.getVec3t()[i];
float tmp;
if(t1>t2){
tmp = t1;
t1 = t2;
t2 = tmp;
} else
tmp = t1;
if (t1 > tNear) {
axe = i;
tNear = t1;
devant = tmp != t1;
}
if (t2 < tFar) {
tFar = t2;
}
// on prend le plus grand t1 et le plus petit t2, et si t1 > t2, c'est que
// la droite rencontre la face droite avant la face gauche, et donc n'est pas dans
// la boite.
if (tNear > tFar)
return false;
// (a uniquement mettre si ton rayon est orienté (si le cube ne peut pas être derrière l'origine du rayon))
// si l'intersection à lieu avant l'origine
if (tFar < 0)
return false;
}
}
Pour les bloc non aligné c'est facile, il suffit de stocker en plus têta et phi, annuler la transformation et faire un test comme si c'était une AABB et pour avoir le point d'intersection, il suffit de le recalculer avec phi et têta.
Vraiment pas compliqué je trouves finalement.
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
|
Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 03 Juillet 2009, 18:12 Message non corrigé | |
|
Ha voilà, j'arrive à sélectionné la boîte en face de la souris :D, normalement d'ici quelques moi je finis l'éditeur de map, je ne vais pas faire un truc trop complexe pour débuter, vaut mieux je crois.
Maintenant que les collisions avec les boîtes marchent, je vais pouvoir avancer un peu plus sur WOTCK! (A non merde j'ai 7 exams à repasser pfff...!!)
Commence à en avoir sérieusement marre de l'école.
Pourquoi on nous permets pas d'apprendre en autodidacte après l'école, moi j'ai franchement envie de continuer à apprendre en autodidacte car il ne me reste plus grand chose à apprendre, juste un peu plus sur de physique et de géométrie et sur les shaders. (Enfin ça fait pas mal encore mais ça va.)
Enfin soit pourquoi pas tenter de fonder un studio plus tard si je réussis pas, ça me tente vraiment. :D
(Ou en rejoindre un mais à ce qu'on m'a dis même avec un BTS je n'ai aucune chance faut au moins un Bac + 5 et encore t pas sûr d'être pris.)
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|
| |
|
| |