2010-12-06 8 views
0

Je suis en train d'écrire un système de détection de collision pour un jeu vidéo de plateforme 3D. Toutes les bases fonctionnent bien. Mais quand le personnage atterrit sur un polygone à forte pente, j'ai besoin qu'ils glissent sur la pente du polygone. Je peux faire la plupart de ceci, mais je ne peux pas savoir comment calculer le vecteur descendant qui correspond à la pente du polygone donné avec lequel ils sont entrés en collision. J'ai cherché de nombreux forums, y compris celui-ci, mais je ne trouve pas la réponse.Comment calculer le vecteur de pente descendante d'un polygone 3D?

Chaque polygone est composé de 3 sommets (x, y, z) dans l'espace monde. J'ai également la surface normale pour chaque polygone, et je suis familier avec les produits dot et croisés.

Je peux aussi calculer une valeur d'angle simple pour le polygone en prenant les arcs du produit scalaire de la face normale et du vecteur monde, ce qui donne l'angle de la pente du polygone à partir du sol, comme 60 degrés . Si l'angle est inférieur à 60 degrés, je décide que le personnage doit glisser sur la pente. Mais j'ai besoin du vecteur descendant qui correspond à la pente du polygone, afin que je puisse appliquer sa position dans le temps et ainsi glisser vers le bas. Je crois que le vecteur de pente devrait être perpendiculaire à la surface normale, mais je ne vois pas comment le calculer étant donné les informations que j'ai.

Merci pour toute aide ...

Répondre

0

Si vous voulez un vecteur indépendant de la vitesse du joueur Trouvez le centre de votre triangle et obtenir un vecteur de celui le plus bas sommet. des tests pour les cas Omettre dégénérés, il ressemblerait à quelque chose comme:

Vertex center = Sum(vertex[0], vertex[1], vertex[2])/3; 
Vertex lowest = Min(vertex[0], vertex[1], vertex[2]); // min of your up/down coordinate 
Vector slopeVector = Normalize(lowest - center); 

Edit: Ce ne serait pas bien pour les triangles équilatéraux ou ceux où le point est pas « faible » souhaitée dans la direction d'un sommet. Une solution plus générale pourrait être de faire tourner la normale de 90 degrés autour d'un axe défini par le centre du triangle et un point sur le côté du triangle à mi-chemin entre les points les plus hauts et les plus bas.

Idéalement, vous ne calculez pas de façon indépendante, mais calculez plutôt des gradients de pente globaux interpolés à travers de nombreux triangles exactement comme si vous calculiez des normales de sommet interpolées.

0

Je n'ai pas les maths en main en ce moment, mais que se passe-t-il si vous avez trouvé la direction 2D en appuyant sur le plat normal (en supprimant le vecteur ascendant), laissant la direction/magnitude bidimensionnelle? Vous pourriez même être capable de tricher et d'obtenir la pente simplement en utilisant 1 - UpVector avec une normale normalisée (1 - terrain plat normal = 0, 1 - falaise verticale pure = 1).

Vous pourriez probablement utiliser le composant Y pour décider quand la pente est assez raide pour appliquer la 2D.

Je ne sais pas si ce sera parfaitement précis, mais cela vous donnerait au moins une approximation rapide.

3

vous devrez également spécifier un vecteur «bas». Ensuite, ce que je crois que vous demandez, c'est la projection normalisée de ce vecteur descendant dans le plan défini par la normale du triangle.

nonUnitAnswer = down - dot(down, triangleNormal) * triangleNormal; // could be 0 
answer = normalize_safe(nonUnitAnswer); 

(vous remarquerez que le point étant que vous avez une face vers le bas poly positif signifie que pour votre scénario coulissant vous voulez probablement gérer différemment)

(et de plus, l'importance du point probablement correspondra à combien vous voulez glisser, et/ou une certaine coupure de si vous voulez glisser du tout)

+0

+1 Je l'ai fait de cette façon dans le passé. Si vous définissez la magnitude de votre vecteur descendant égale à votre force gravitationnelle, alors le vecteur nonUnitAnswer non normalisé sera la composante de la force gravitationnelle qui agit dans la direction descendante - une valeur utile. –

Questions connexes