Par exemple, prenez ce scénario (excusez mes horribles compétences en dessin):
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?
Réponses:
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.
la source
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 comme
if (!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.
la source
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.
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.
la source
When an object touches the portal, it starts potentially colliding with things on the other side
Oui, exactement. Comment pourrais-je faire cela avec un moteur physique? Je suppose que c'était ma question :)