Comment implémenter la détection de collision de portails?

12

Par exemple, prenez ce scénario (excusez mes horribles compétences en dessin): image

Ceci est basé sur "Portal", où le stickman passe par le portail bleu (qui est lié au portail rouge), mais il y a un mur qui l'arrête sur le portail rouge. Il ne peut donc pas passer complètement par le portail.

Ma question est donc la suivante: comment puis-je effectuer la détection physique / collision avec eux? Dois-je trancher le lecteur? Existe-t-il un moyen de les lier? Existe-t-il des moteurs physiques qui prennent en charge cette opération? Sinon, comment pourrais-je en faire un?

MiJyn
la source
Autant que je sache, ils expliquent certaines des choses dans le commentaire du développeur de Portal 1.
Archy
@ Byte56, merci, j'ai mis à jour mon message. Je pense que cela devrait clarifier davantage :)
MiJyn
1
Je pense que la situation que vous décrivez est très rare dans le portail (si cela se produit), car les portails ne sont pas placés librement. Ils sont placés sur des murs, et uniquement sur des murs spécifiques. Je ne me souviens pas d'une situation où j'ai pu placer un portail, mais incapable de le traverser en raison d'une obstruction à l'autre extrémité du portail. J'imagine que vous pourriez créer une copie temporaire du lecteur aux deux endroits pour la période de transition.
MichaelHouse
2
@ Byte56: Vous ne devez pas vous souvenir de grand-chose. Je me souviens que cela se faisait dans Portal 1. Je semble me souvenir d'une zone d'écrasement où l'on pourrait utiliser un portail pour éviter de mourir. Entrer en collision avec des objets près des portails est un phénomène courant et le moteur le gère facilement.
Nicol Bolas

Réponses:

7

Le jeu Portal a une belle façon de résoudre ce problème:

Le joueur passe à travers le portail source (bleu) et on le voit sortir du portail cible (orange). Le joueur est copié sur le portail cible et vu le traverser. Le jeu restitue l'image que vous voyez lorsque vous regardez à travers le portail source en utilisant une deuxième caméra et un rendu en texture.

Cependant, la copie du joueur à l'emplacement cible n'interagit pas avec la physique. Il n'est là qu'à des fins de rendu. Au lieu de cela, ils créent des objets de collision virtuels de l'autre côté du portail source, et obligent le joueur à entrer en collision avec cela à la place. Cela rend la physique simple.

Vous n'avez besoin de ces objets virtuels que dans la mesure où le joueur peut l'atteindre sans passer entièrement par le portail. Dès que le joueur franchit complètement le portail, la situation s'inverse.

Une image pour illustrer : Le portail bleu est le portail source, le portail orange le portail cible. La boîte blanche en pointillés est l'objet de collision virtuelle, tandis que la vraie boîte est l'objet rendu. Le joueur (avec le point rouge) n'interagit qu'avec les objets directement autour de lui. Les objets du portail orange sont complètement ignorés.

entrez la description de l'image ici

Daniel AA Pelsmaeker
la source
4
"en utilisant une deuxième caméra et le rendu à la texture " Le commentaire des développeurs sur Portal 1 a explicitement dit qu'ils n'utilisaient pas le rendu à la texture, parce que cela ne fonctionnait pas bien pour leurs besoins (en particulier en voyant les portails d'autres portails ). Au lieu de cela, ils transforment essentiellement une version du monde de l'autre côté du portail et ne font que le restituer.
Nicol Bolas
Wow, cela répond à presque tout! Je me demande simplement, cela fonctionne-t-il si le portail est un trou avec des objets à l'intérieur?
MiJyn
6

Voici comment j'essaierais de le faire.

Pendant que vous êtes à l'intérieur d'un portail, il y aurait deux copies du lecteur dans le moteur physique. Chaque copie ignore toutes les collisions qui se trouvent du côté opposé du portail, puis vous combinez les résultats et appliquez les résultats de la simulation aux deux modèles.

Idéalement, vous appliqueriez la gravité séparément pour chaque moitié du joueur, mais vous pourriez vous en sortir en l'appliquant simplement sur le côté du portail sur lequel se trouve le centre de gravité du joueur.

Pour ignorer ces collisions, vous devez configurer un volume approprié et tester si un point s'y trouve. Un cylindre (éventuellement étiré verticalement) semble être une bonne option. Le test est alors quelque chose commeif (!collisionPoint.InsideCylinder(portal)) ProcessCollision(); else IgnoreCollision();

Je crois que la plupart des moteurs physiques ont un système pour filtrer ce avec quoi un objet peut entrer en collision, il devrait donc être possible d'utiliser un moteur physique standard. Par exemple http://bulletphysics.org/mediawiki-1.5.8/index.php/Collision_Filtering#Custom_collision_filtering

Pour combiner les résultats, l'option la plus simple serait probablement d'ajouter une sorte de contrainte inflexible entre les deux et de laisser le moteur physique s'en occuper.

Adam
la source
Hmm, ok, comment pourrais-je faire ça? Je reçois la partie sur la copie du joueur, mais à part ça, je ne sais rien. Comment pourrais-je ignorer les collisions du côté opposé? Comment pourrais-je même combiner les résultats?
MiJyn
J'ai édité plus de détails.
Adam
merci, j'y penserai et répondrai plus tard une fois que je pourrai mettre les
choses
Merci beaucoup, votre réponse et la réponse de Virtlink à ma question :) Maintenant, pour décider lequel définir la "bonne réponse" à ...
MiJyn
4

Comment calculer jusqu'où le joueur descend?

Pourquoi voudriez-vous? Vous n'avez pas besoin de calculer jusqu'où un joueur "descend"; vous découvrirez jusqu'où il va lorsque l'objet passe par la simulation.

Comment pourrais-je même connecter les portails?

Un portail, d'un point de vue purement dans le jeu, n'est rien de plus qu'un téléporteur élaboré qui joue avec la collision pour transformer des objets collidables en objets non collidables. Lorsqu'un objet touche le portail, il commence potentiellement à entrer en collision avec des choses de l'autre côté. Lorsque l'objet passe "assez loin" par le portail, vous le téléportez efficacement vers l'autre, en changeant instantanément sa position et son orientation.

La physique se déroule simplement comme d'habitude.

Nicol Bolas
la source
When an object touches the portal, it starts potentially colliding with things on the other sideOui, exactement. Comment pourrais-je faire cela avec un moteur physique? Je suppose que c'était ma question :)
MiJyn
@MiJyn: Vous écrivez un moteur physique qui peut le faire. Valve a dû essentiellement casser le moteur source pour que Portal fonctionne réellement. Aucun moteur physique commercial ou open source ne peut naturellement le faire. Il y a une raison pour laquelle, malgré la popularité de Portal, il n'y a pas de dizaines de clones Portal sur le marché.
Nicol Bolas
intéressant, car il y a beaucoup d'autres jeux qui ont des mécanismes très similaires (voir même le mod TARDIS pour minecraft). Je suis sûr qu'il doit y avoir un moyen de le faire facilement.
MiJyn