PDA

Voir la version complète : Détection collision avec une map BSP Quake3


Comtois
05/12/2005, 22h53
Je commence tout juste à me documenter sur le sujet ,et j'aurais besoin d'éclaircissements.
sur ce site j'ai trouvé pas mal d'infos :
Unofficial Quake 3 Map specs (http://graphics.stanford.edu/~kekoa/q3/)

Mais c'est confu , enfin pour moi .

J'ai lu que pour la détection des collisions il fallait tester :

8 Brushes Convex polyhedra used to describe solid space.
9 Brushsides Brush surfaces.

Mais c'est quoi la différence avec :

10 Vertexes Vertices used to describe faces.
11 Meshverts Lists of offsets, one list per mesh.
13 Faces Surface geometry.

Faces , Vertexes , C'est uniquement pour l'affichage ?

Si quelqu'un pouvait me mettre sur la piste , j'ai bien trouvé ça

Collision detection (http://www.devmaster.net/articles/quake3collision/)

Ce que je comprends , c'est qu'il va falloir que je gère l'arbre BSP en lisant les noeuds dans le fichier et les infos brushs associées.

Ensuite que j'essaye de comprendre le tut ci dessus , mais après ? j'ai l'impression qu'il permet de dire si on est en collision , mais pour gérer les réponses ? je n'ai rien vu .

Si quelqu'un a déjà fait un truc de ce genre , je serais intéressé qu'il décrive dans les grandes lignes ce qu'il faut faire.

Je n'ai besoin que de la gestion des collisions , pour l'affichage, je laisserai la lib 3D de PureBasic s'en charger.Je sais que ça peut sembler un peu lourd de gérer deux fois le fichier , une fois par la lib pour l'affichage , et une seconde pour la gestion des collisions , je verrai plus tard comment faire autrement , ce qui m'intéresse c'est de comprendre comment fonctionnent les collisions.

Je n'ai pas encore de question précise ,pour l'instant je cherche à collecter un maximum d'informations ,jusqu'à ce que tout soit clair dans ma petite tête.

Je suis dans la phase défrichage et tout aide sera la bienvenue :)

Bahamut
08/12/2005, 12h13
Le lien que tu donnes décrit seulement le formalisme des fichiers Q3 au format BSP. Ni plus, ni moins. Il faut savoir qu'un fichier Q3 nommé xxx.bsp ne contient que des informations de géométrie + quelques autres trucs. Le système de collision est un truc à part.

Le BSP n'est pas seulement un format de map pour Q3 mais c'est avant tout un algorithme qui permet :
- d'afficher que les polygones visibles par le joueur
- de partitionner le monde en zone pleine/zone vide

d'où l'ambiguïté du nom du type de format des fichiers des maps Q3.

Les fichiers Q3 contiennent :
- Des sommets (anglais: vertices)
- Des faces (anglais: faces) -> une face = 3 ou 4 sommets
- Des objets solides (anglais : models) -> un objet = 3,4,5, n faces
- Des textures d'ombrage (anglais: ligthmaps) (cf. multitexturage)
- Des zones d'éclairage volumétriques (anglais: lightvol) : composé de n faces
mais aussi :
- des noeuds (anglais : nodes)
- des feuilles (angalis : leafs)
- la liste des toutes les faces pour une feuille (anglais : leaffaces)

Qu'est qu'un noeud ou une feuille ?
--> http://www.games-creators.org/wiki/Généralités_sur_les_arbres_BSP


Pour revenir aux collisions, en suivant le contenu de l'article, il suffit de savoir si un point est dans une zone pleine ou vide. Dans le cas d'un jeu, ce n'est plus un point mais un joueur. Ce n'est pas pour autant plus compliqué :

Il suffit de définir une boite englobante invisible dans laquelle sera placé le joueur. Une boite étant composée de 4 sommets, alors le systeme de collision sera :
- si au moins un des 4 points composants la boite englobante est dans une zone solide alors il y a collision.


Si tu n'arrives pas avec cela, j'ai un morceau de code pour les collisions BSP à disposition.
Bon courage.

Comtois
08/12/2005, 12h32
Merci pour les informations, je serai sûrement intéressé par ton bout de code plus tard , mais avant il faut que je me familiarise avec la création et l'utilisation d'un arbre BSP.

J'ai trouvé ce cours , très complet
http://perso.wanadoo.fr/philippe.baucour/pratiquer/opengl/bsp/bsp1.html

Je vais commencer par coder ça pour me faire la main , et je reviendrai au format Q3 après.

D'après tes explications , on peut juste dire si on est en collision , mais ensuite pour gérer la réponse (collision glissante ) ?

Je sais le faire si j'ai une liste de triangles du monde 3D.
Mais dans une map Q3 , quelles sont les informations à exploiter ?
C'est là que ce n'est pas clair pour moi.

Et merci pour ton tut , je l'avais lu depuis un moment déjà , en me disant c'était trop compliqué pour moi , mais c'était fort intéressant, je découvrais le principe :)

Maintenant je me sens prêt à m'attaquer à ce genre de sujet :)

miosepayo
21/04/2006, 15h42
Bonjour,

J'aurais aimé savoir si vous pouviez m'apporter une précision sur la détection de collision dans les BSP de Quake.

Je suppose que toute personne qui tente d'implémenter un système de collision dans les BSP se base sur le tutorial de Nathan Ostgard :

http://www.devmaster.net/articles/quake3collision/

Un test m'échappe dans CheckBrush :


if (startDistance > endDistance)
{ // line is entering into the brush
float fraction = (startDistance - EPSILON) / (startDistance - endDistance);
if (fraction > startFraction)
startFraction = fraction;
}
else
{ // line is leaving the brush
float fraction = (startDistance + EPSILON) / (startDistance - endDistance);
if (fraction < endFraction)
endFraction = fraction;
}

J'ai compris que le premier cas permet de savoir si la collision actuelle est plus proche ou pas que les autres collisions éventuellement détectées au préalable.

mais je ne vois pas l'utilité du second test, est ce dans le cas d'un brush très fin qui serait entièrement traversé lors d'un déplacement (on y rentre et on en sort durant le même mouvement)

merci