Il y a deux façons de répondre à cette question que je peux voir. Tout d'abord, si vous voulez simplement trouver un moyen de piloter, il vous suffit d'implémenter le pathfinding ( je trouve cela très utile ). Ce serait la fin de cela (et c'est la bonne réponse pratique à cette question), mais je pense que vous êtes plus curieux de trouver une solution mathématique à votre problème.
Pour résoudre ce problème, examinons un problème équivalent. Prenez une tranche 2D de votre scène "devant" votre pilote d'un avion normal au vecteur d'origine. Vous obtiendrez un point qui représente votre vecteur d'origine et une série d'ellipses qui sont les projections 2D de vos cônes d'occlusion. Maintenant, ce que vous voulez faire est de trouver le point le plus proche de votre point d'origine (appelons-le P
) qui se trouve à l'extérieur des ellipses qui ne se chevauchent pas. Il s'avère que c'est un problème assez difficile à résoudre. Il y a 3 étapes:
- Découvrez les points d'intersection de toutes vos ellipses
- Trouvez tous les trous dans l'union de toutes vos ellipses
- Déterminez le point le plus proche de
P
toutes vos ellipses en dehors de l'union (qui peut être à l'intérieur d'un trou)
D'accord, tout cela nécessite des multiplicateurs de Lagrange et une vérification d'angle et d'autres choses vraiment compliquées à résoudre. Examinons d'autres options. Si nous transformons plutôt notre problème en espace angulaire, nous voyons que ce que nous voulons réellement faire, c'est trouver la distance minimale entre un point et plusieurs cercles projetés sur la surface d'une sphère. En géométrie différentielle, cela est souvent appelé une sphère 2 et est utile ici. Donc, tout d'abord, nous devons trouver la distance entre deux points sur la surface de la sphère, que nous utiliserons pour trouver la métrique à 2 sphères. Heureusement, c'est assez facile: ds^2 = (R^2)*(dth^2) + (R^2)*(sin(th)^2)*(dph^2)
où nous maintenons R
constant le rayon de notre 2 sphères projeté dans 3 espaces. Venant de la physique, je prends th
pour être l'angle du positif z
et ph
pour être l'angle du positif x
avecs
étant la distance.
Qu'est-ce que cela fait? Il nous permet de supprimer l'utilisation des multiplicateurs de Lagrange pour minimiser la distance, et nous permet de travailler en coordonnées "natives" (puisque nous définissons nos cônes en termes d'angle d'occlusion). Alors maintenant, nous devons trouver le rayon de nos projections de cônes. Prenons un cône pour l'instant et appelons l'angle qui le définit a
. Le rayon de la projection est alors simplement R*a
. C'était assez facile - quelle autre quantité devons-nous savoir sur les cônes? Nous devons connaître le centre de la projection, qui est défini par le vecteur de regard de l'acteur. Tout d' abord nous convertir x
, y
et z
en coordonnées sphériques où nous savons que nous sommes à une distance R
, et résolvons pour th
et ph
que nous pouvons faire en branchant simplement dans nos formules de conversion:th = acos(z/R)
et ph = atan2(y/x)
(utiliser atan2
ici pour tenir compte des ambiguïtés du quadrant d'arctangent). Le processus est le même pour trouver la position de votre vecteur d'origine en coordonnées sphériques.
Le problème a donc été simplifié. Cependant, le problème est encore assez difficile à résoudre, mais maintenant vous n'avez plus qu'à vous soucier des cercles et des points au lieu des ellipses et des points ou des angles et des vecteurs. Le reste du processus est plutôt procédural. Vous devez essentiellement trouver une zone de délimitation formée par vos cercles, pour laquelle il existe plusieurs solutions. Je vais présenter une méthode qui n'est peut-être pas la meilleure, mais qui fonctionnera.
Je comparerais d'abord la somme des rayons de toutes les paires de cercles et la distance entre les centres, puis si leur somme est plus grande que la distance centrale, définissez-les égales et résolvez pour th
etph
pour trouver les intersections. Vous savez que chaque paire d'intersections décrit des "angles interdits" pour le cercle en question, que vous stockeriez comme un tableau d'angles de point d'intersection (à partir du centre du cercle) pour chaque cercle qui coupe celui-ci - vous devez absolument " fusionner "toutes les plages qui se chevauchent lorsque vous les ajoutez au tableau pour que la partie suivante fonctionne correctement. Ensuite, vous trouvez le point le plus proche sur le bord du cercle au point d'origine (ce qui est aussi simple que de tracer une ligne passant par le centre du cercle et le point d'origine, puis de trouver l'emplacement sur la ligne au rayon du cercle du centre). Parcourez ensuite votre tableau stocké et testez si cet angle est dans la plage de chaque angle interdit. Si c'est le cas, sélectionnez l'arête la plus proche. C'est le point le plus proche de l'extérieur décrit à l'intérieur de ce cercle. Répétez le processus pour tous les cercles (une certaine optimisation peut être effectuée dans le processus de sélection - vous n'avez pas réellement besoin de le calculer pour chaque cercle). Comparez maintenant toutes vos distances les plus courtes, trouvez la plus petite, et c'est votre réponse, décrite dans les anglesth
et ph
. N'oubliez pas que la distance est décrite avec la métrique à 2 sphères lors de l'exécution de ce calcul. Puisque vous ne vous souciez pas de la sphère sur laquelle tout cela se trouve, uniquement des angles, vous pouvez définir R=1
et effectuer ces calculs sur la sphère unitaire.
C'est la façon la plus simple que je pourrais penser de le faire. Je ne suis pas sûr que ce soit le moyen le plus simple, mais cela fonctionnerait plutôt bien. Pratiquement pour un jeu, cependant, vous voulez simplement implémenter le pathfinding.