0
votes

Transformer un vecteur pour adhérer à un vecteur gratuit avec troisjs

Je suis confronté à un problème gênant tout en essayant de créer un moteur de jeu en troisjs. C'est un problème de mathématique, mais aussi un problème de programmation.

J'ai mis en place un système de déplacement basé sur la vitesse pour l'avatar du joueur - j'ai utilisé un réservoir dans cet exemple.

Actuellement, lorsque le joueur frappe un mur, quel que soit l'angle, le réservoir arrête invariablement mort.

Cependant, je veux que ce soit le cas que la vitesse du réservoir change, ayant été contrainte pour suivre l'angle du mur et également réduit par une magnitude liée à cet angle. < / p>

Par exemple, à la Fig A, lors de la frappe du mur, le réservoir continue d'essayer d'avancer, mais la vitesse est altérée de sorte qu'elle passe maintenant en avant et latéralement, à un taux réduit.

sur la figue B, le réservoir frappe le mur mort-on et sa vitesse globale atteint 0.

sur la figure C, le réservoir jette un coup d'œil sur le mur et sa vitesse globale n'est réduite que par une petite quantité.

J'ai réalisé que j'ai besoin de combiner d'une manière ou d'une autre de combiner le vecteur de vitesse du réservoir avec le vecteur normal du mur, de produire le vecteur ajusté, mais je me débats avec la manière de représenter cela mathématiquement / de manière programmatique.

J'ai essayé d'utiliser: tank.velocity.Multiphe (wallfacénormal); (les deux tank.velocity et wallfacenormal sont Vector3 objets.) Mais cela ne semble que fonctionner comme prévu lorsque le mur est soit à des angles de 0, 90, 180 ou 270.

 diagramme de problèmes de réservoir


0 commentaires

3 Réponses :


1
votes

Puisque un réservoir ne sautera pas ou ne volera pas, vous devez aller avec juste un système 2D pour votre calcul?

J'ai trouvé un lien décrivant la physique de la voiture frappant un mur de briques solide.

http://colgatephys111.blogspot.com/2017/12/guardrail-lessens-force-fof-impact.html

espoir ça va vous aider un peu!

EDIT: Donc, hors de curiosité, j'ai demandé à un physicien théorique par téléphone sur votre problème.

Vous avez 2 problèmes séparés à résoudre: 1. P1 Quelle est la vélocité v 'en frappant le mur? 2. P2 Quel est le nouvel angle du véhicule?

P2 doit être assez facile, en tenant compte de votre réservoir s'adapte à l'angle du mur que vous n'avez besoin que de calculer dans quelle direction le mur "pointe".

P1 en physique, nous parlerions de la force réduite et non de la vitesse, mais donnait une limite constante à la force F1 (par exemple, votre moteur) entraînant une constante maxpeed, et avec une force donnée, le mur a sur le véhicule F2 xxx

Je pense https://www.thuthuth.fr.com/ What-Is-the-Physics-of-A-Car-Collision-2698920 explique quoi faire


1 commentaires

Merci pour la réponse! Et des excuses pour le retard) assez étrangement, je parlais à un ami physicien de la mienne aussi! Il m'a envoyé un exemple de code C # en tant que guidage, mais je n'ai jamais été tout à fait capable de le faire fonctionner, car il y avait quelques petites erreurs, et un manque de compréhension mathématique de ma part. Je l'ai attaché à la question comme une réponse potentielle.



0
votes

Certains codes fournis par un physicien, qui fonctionnait en partie lorsque je l'ai converti sur JavaScript et l'a appliqué au programme:

Vector3 wallNormal = new Vector3(-0.5, 0.0, 0.5);
Vector3 incomingVelocity = new Vector3(0.0, 0.0, -1.0);

double magnitudeProduct = wallNormal.Length() * incomingVelocity.Length();
double angleBetweenVelocityAndWall = ((-incomingVelocity).Dot(wallNormal)) / (magnitudeProduct);

double newVelocityMagnitude = incomingVelocity.Length() * Math.Sin(angleBetweenVelocityAndWall);

Vector3 upVector =incomingVelocity.Cross(wallNormal);
Vector3 newDirection = wallNormal.Cross(upVector);
Vector3 newVelocity = newDirection.Normalise() * newVelocityMagnitude;


0 commentaires

0
votes

J'ai fait du travail sur ce problème et j'ai produit un "framework" de mini-jeu qui inclut un utilitaire de collision et d'atténuation de mouvement de l'environnement.

J'ai écrit un article qui explique comment cela fonctionne, qui peut être trouvé ici . http://www.socket-two.com/main/resource/hdoc- Tutoriel

mais pour l'intégré du fil, voici une adaptation de la partie décrivant l'une des approches pouvant être utilisées pour atténuer le mouvement dans une simulation de trois-mJs:

...

cruciale, mon intérêt n'a pas été de créer des jeux qui impliquent une grande quantité de physique, mais simplement pour créer des jeux où:

  • Un joueur ne peut pas marcher à travers les murs
  • Un joueur ne peut pas tomber à travers les sols

    J'ai fait une poignée de tentatives de mise en œuvre d'un système qui réaliserait ce comportement, mais aucun d'entre eux n'a vraiment travaillé de manière satisfaisante. Jusqu'à présent.

    en termes de la manière dont la CES s'inscrit dans l'architecture de l'application, c'est une classe d'utilité. Ceci est sa forme de l'API: xxx

    Comme vous pouvez le constater, c'est une classe qui accepte deux tableaux de mailles dans son constructeur: mailles qui doivent être traitées comme des sols et meshes devrait être traité comme des murs. Maintenant, bien sûr en réalité, il n'y a pas de distinction claire entre un sol raide et un mur coudé peu profond, mais aux fins de la simulation, la distinction a une intégrité très raisonnable et simplifiera grandement la logique du système de collision de l'environnement.

    Une fois que vous avez construit une instance de la classe Planeclamamp, vous pouvez ensuite invoquer la méthode getafeposition, de transformer une position de départ et une position prévue en une position atténuée. Être le lecteur averti que vous êtes, vous aurez déduit que la position atténuée est la position souhaitée, après avoir été modifiée un peu si des collisions ont été détectées par l'utilitaire.

    Voici comment il peut être utilisé Dans la boucle de jeu, pour assurer un joueur ne passe pas à travers les murs ou les sols: xxx

    et c'est-à-dire à ce sujet! Si vous souhaitez utiliser cet utilitaire, vous pouvez le trouver dans le référentiel. Mais si vous souhaitez en savoir plus sur la logique derrière ses travaux, lisez-le.

    La méthode PlaneclamP.getsafeposition fonctionne une position sûre en deux étapes. Premièrement, il utilise un rayonnaster vertical pour jeter un coup d'œil sur ce qui est sous le joueur, puis voir s'il doit arrêter le joueur de se déplacer vers le bas. Deuxièmement, il utilise des rayons horizontaux pour voir s'il doit arrêter le joueur de se déplacer horizontalement. Permet de regarder la procédure de contrainte verticale d'abord - c'est la plus simple des deux étapes. xxx

    et c'est celui-ci pour les contraintes d'environnement vertical. Simples!

    Le système de contraintes d'environnement horizontal est un peu plus complexe. Mais dans son essence, ce qu'il fait est:

    1. Equifiez la direction horizontale que le joueur voyage dans. Dans les termes de Olde Worlde, cela peut être considéré comme nord, sud, sud-est, sud-sud-ouest, etc., mais dans troisjs, il est représenté par un vecteur.
    2. jetez un rayon dans la direction que le joueur voyage dans.
    3. Utilisez le rayon pour savoir si vous permettant à la position souhaitée des joueurs entraînerait passer le joueur à travers n'importe quel maillage mural.

      Et c'est à ce stade que les CE horizontales deviennent plus complexes que les CE verticaux. Avec les CE verticaux, si une collision se produit, nous ne pouvons que définir la position des joueurs Y sur la position Y du point auquel la collision s'est produite - en cas d'arrêt efficacement des joueurs y. Cependant, nous l'avons fait pour le mouvement horizontal, cela ferait une expérience de jeu très frustrante.

      Si le joueur courait la tête dans un mur et a été arrêté mort dans leurs morceaux, ce serait bien . Mais si le joueur se déplaçait dans le mur à un angle très peu profond et que je le faisais simplement la pâtiré, il semblerait qu'ils avaient "devenaient coincés" sur le mur et se retrouveraient à deviner de l'éloigner et veiller à ne pas toucher Encore une fois.

      Ce que nous voulons réellement se produire, a atténué la vitesse horizontale du joueur, de sorte qu'ils se déplacent le long du mur. Par conséquent, les CE horizontales se déroulent comme suit:

      1. Obtenez la normale de la surface qui a été collée avec. (Pour nos buts, une normale peut être décrite comme la direction que le mur est confronté)
      2. Inspectez la différence entre la direction normale du mur et la direction du mouvement du joueur.
      3. Utilisez la différence pour éliminer une position sûre, qui est le point dans l'espace que la collision s'est produite, incrémentée par un vecteur horizontalement perpendiculaire au mur normal, multiplié par le produit croisé du sens de saisie des joueurs et du mur normal.

        ...

        Voici la classe utilitaire finale, en totalité: xxx


0 commentaires