Oriented Bounding Boxes

Signaler
Messages postés
154
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
12 décembre 2008
-
DarkBoss
Messages postés
154
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
12 décembre 2008
-
Bonjour tout le monde,
J' ai une petite question pour certains, une grande pour d' autres ( comme moi ^^ ).
J' aimerais savoir comment effectuer une "rotation d' une bounding box", comme une OBB.
En fait j' ai deja lu pas mal de trucs la dessus, et sa a l' air compliqué, covariance de matrice ( kézako ? ) etc...
La situation est la suivante:
J' ai mon niveau dans lequel ce trouve un bloc, comme mon niveau est exporté par un script d' export GMAX,
dans mon "moteur 3d" il faut que j' effectue une rotation de -90° sur l' axe des x; cependant je calcul
ma bouding box, et quand je lance mon jeu, la bounding box a garder le bloc du départ ( non rotaté ) comme model.
Alors ma question est la suivante, comment implémenté simplement une oriented bounding box sans space partitionning
pour faire une "rotation de la bounding box".
C' est très confu et j' en suis désolé.
Merci beaucoup car je galère un peu la dessus.
A+

DarkBoss

10 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Tu dois pouvoir gérer les rotations suivant les 3 axes pour n'importe quels angles ?

Le bounding sphere suffit pas ?

T'as quel niveau d'étude (de maths surtout) ?
Messages postés
154
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
12 décembre 2008

luhtor, merci de me repondre, a chaque fois que je poste une question de graphisme tu es la pour me guider mon gouroux ^^
alors je suis en terminale ES, je pense que ca devrais suffire ( lol ), non plus serieusement, la bouding sphere ne suffiras pas car j' ai besoin de detecter les collisions avec
murs, sols, objets( la ca suffira ).
Pour les axes si j' ai bien compris oui j' aimerais pouvoir gérer cela.
DarkBoss
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Ah bon :) c'est vrai que c'est plutot mon domaine opengl :) mais je fais pas attention au nom de la personne à qui je réponds ^^


C'est sur que pour les murs, le bouding sphere ne suffit pas.

Terminale ? donc ca veut dire qu'une matrice de rotation, tu vois pas
trop ce que c'est. Enfin on peut utiliser (plus simplement ?) les
produits scalaires, mais la encore, je suis pas sur que tu saches ce
que c'est exactement ? (faut attendre l'année prochaine pour ca)

Une bounding box ca peut se définir avec un centre (du pavé), une base
liée au pavé (3 vecteurs unitaires), et les 3 dimensions du pavé.
Ensuite apres un premier bouding sphere pour éliminer la plupart des
cas. Tu peux à l'aide de plusieurs produits scalaires tester s'il y a
collision ou non.


Mais si la rotation suivant l'axe verticale suffit (suffit elle dans ton cas ?), c'est bcp plus simple.
Messages postés
154
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
12 décembre 2008

Alors j' ai quelques base, normalisation, produit scalaire, vecteur unitaire je ne suis pas sur mais cela peut ce trouver, mais j' aimerais surtout en fait c' est faire comme un glRotateF, mais pour ma bounding box; je m' explique, glRotatef permet de faire une rotation visuel, moi j' aimerais faire une rotation de coordonnée c' est a dire que les coordonnée soient transformées comme si elles avaient subient une rotation.
Je ne sais pas si cela est possible par contre.
Pour les precision, mes bounding boxes sont définies par xmin xmax ymin ymax zmin zmax mais je n' ais pas le barycentre, je peux cependant rajouter un barycentre dans ma structure ca ne me gene pas mais je ne vois pas a quoi cela servirais, donc si tu pouvais m' expliquer ou meme me faire découvrir du code pur, pas du meta code j' en serait comme tout heureux ;)

DarkBoss
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Bas oui glRotatef ca multiplie par une matrice de rotation. Mais je
suis dsl, mais je vois pas comment te l'expliquer. Dans tous les cas,
tu auras besoin du centre de ton bounding.

Tu pourrais utiliser opengl pour te calculer la matrice:

- tu charges la matrice identité

- tu fais les rotations que tu veux

- tu récupères la matrice que tu stokes dans un tableau


Soit P le centre de ton pavé, et M le point que tu veux tester.

Le vecteur PM multiplié par l'inverse de la matrice (ici la transposée
de la matrice que tu as récupérés) te donne un nouveau vecteur qui
correspond aux coordonnées du point M dans la base lié au bouding. Soit
R ce vecteur. Apres c'est tout simple:

si abs(R.x) < demi coté selon x et abs(R.y) < demi coté selon y et abs(R.z) < ...

alors le point M est dedans donc en collision.


Mais avec les produits scalaire c'est plus efficace: (toujours avec la
matrice récupérée de opengl), soit U1, U2, U3 les colonnes 1 et 2 et 3
de la matrice. C'est en fait les vecteurs de la base liée au bounding.

Soit P le centre de ton pavé, et M le point que tu veux tester.

Si abs(PM scalaire U1) < coté selon U1 et abs(PM scalaire U2) < coté selon U2 et ...

alors collision.
Messages postés
154
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
12 décembre 2008

Hum, je vois mieux pourquoi tu me demandais quel niveau j' avais en maths .
Moi je voudrais juste que la bbox se retrouve orientée de la même manière que mon bloc,
c' est peut - etre ce que tu as voulu me dire lol mais je ne comprend pas tout en fait en gros j' aimerais faire une rotation d' un pavé comme le fait opengl,
a paramant c' est ce que tu me dis, mais abs c' est quoi comme fonction ? et comment récupérer les colonnes 1-2 et 3 de la matrice ?

DarkBoss
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
a pardon, abs (c'est connu) c'est "valeur absolue".

Mais ce que tu veux, c'est ce que j'essais de t'expliquer :) Tourner un
cube c'est pas dure, mais faut pouvoir tester les coordonnées apres
pour la collision.


Une matrice c'est un tableau de 16 valeur. Soit T ce tableau. La
première colonne, c'est T[0], T[4], T[8], T[12] c'est pas compliqué :)


Le produit scalaire tu connais ?
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Enfin tout ce que je te racontes, c'est simple. Tu verras ca l'année prochaine en prepa ou fac scientifique.
Messages postés
154
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
12 décembre 2008

ok lol donc cen gros faut deja que j' aprenne quelques trucs sur les matrices etc...
je me demandais si c' etait pas plus simple de lancer un rayon et de voir si quelque chose le traverse
et s' il le traverse a une distance trop proche -> collision ?!

DarkBoss
Messages postés
154
Date d'inscription
samedi 3 août 2002
Statut
Membre
Dernière intervention
12 décembre 2008

je me suis renseigné sur les matrices,
donc j' ai trouvé cela et si j' ai bien compris cela donnerais pour une rotation de 90°,pour le point p(2,3,10),sur l' axe z:

<hr />
théta = pi/2

| 0    -10    0    0 |    | 2   |    | -20 | x
|10     0     0    0 |    | 3   |    | 30  | y
| 0      0     1    0 | x | 10 | = | 10  | z
| 0      0     0    1 |    | 1   |    | 1 | << en gros on s' en fou c le truc de projection ou j'sais pas quoi

<hr />
Alors j' ai bien travaillé ou pas ? ^^
a + et merci de ton aide précieuse qui m' a permis de m' instruire et de me démystifier les matrices !!