Comment s'assurer que les objets en rotation frappent une cible avec l'extrémité droite?

25

Je travaille sur une arme de type couteau de lancer où un joueur vise librement puis jette un couteau. Le couteau tourne dans les airs et, lors d'une collision, il s'arrête de tourner et se dirige vers l'objet avec lequel il est entré en collision. La rotation est gérée via une animation tandis que la trajectoire du couteau est gérée par la physique.

Un problème auquel je suis confronté est de savoir comment s'assurer que lorsque le couteau entre en collision avec un ennemi, le couteau sera face à lui. Pour le moment, ce qui se passe parfois, c'est que le couteau s'enfonce d'abord dans la poignée ennemie. Ce qui est évidemment irréaliste. Dans le même temps, je pense qu'il serait tout à fait déraisonnable que le couteau ne "frappe" l'ennemi que s'il a heurté la lame en premier, car la vitesse à laquelle le couteau tourne est hors du contrôle du joueur.

J'ai regardé beaucoup de séquences de killcam lentes d'armes similaires et chaque fois que l'arme est lancée, elle tourne dans les airs et se retrouve toujours comme par magie avec la lame pointée sur sa cible. Pour un jeu où la distance de lancer sera constante, c'est assez simple à faire. Mais je ne sais pas trop comment prédire cela, car de nombreux facteurs imprévisibles sont impliqués, par exemple. direction du couteau, rotation du couteau, position de l'ennemi, distance de l'ennemi, etc. Si possible, je préférerais ne pas avoir à utiliser une logique de prédiction complexe car le jeu sera pour des appareils assez bas de gamme. Existe-t-il un moyen de «résoudre la fumée et les miroirs»?

Exemple: https://youtu.be/0fav8lFpBko?t=42s

L'extrémité avant
la source
15
Le couteau qui frappe toujours une lame cible en premier n'est pas réaliste non plus, en particulier lorsque nous parlons d'une cible en mouvement.
Theraot
1
Selon la saveur du jeu, il existe un certain nombre de styles de lancer de couteau qui ne font pas tourner la lame. Habituellement, ils utilisent des couteaux spécialement conçus pour voler de manière stable.
Perkins
si le centre de masse du couteau est beaucoup plus proche de l'extrémité de la poignée plutôt que de l'extrémité de la lame, et que la vitesse de rotation du couteau est beaucoup plus élevée que sa vitesse de déplacement, alors il pourrait en fait toujours toucher la cible avec la lame. ce serait un couteau très étrange cependant, et une créature très étrange qui pourrait le lancer comme ça
Sarge Borsch
2
Ce problème est suffisamment important pour qu'il y ait un article à ce sujet sur TVTropes: The Blade Always Lands Pointy End In
Mason Wheeler
J'aime aussi la distinction faite dans la question. Si vous avez changé la rotation pour qu'elle soit également gérée par le moteur physique, vous pourriez avoir suffisamment d'informations pour effectuer un calcul au moment de la collision pour voir si l'extrémité du couteau faisait face à la cible assez bien ou non. Soit cela, soit conserver l'animation, et juste précuire les valeurs où les animations du couteau pointent vers l'avant et comparer le cadre d'animation actuel pour voir s'il se trouve dans cette plage ou non.
Pysis

Réponses:

35

Fake it

Regardez la vidéo que vous avez liée, regardez-la au ralenti ... eh, qu'est-ce que c'est? La caméra saute à la fin, et le couteau est déjà dans le casque de la cible.

Faux-le. Une fois que la distance entre le couteau et la cible est petite, coupez le couteau par magie dans la cible.

Modifier: vous pouvez vérifier s'il atteindra une cible en utilisant la prédiction alambiquée, puis prétendre qu'il a touché la lame en premier, puis afficher une animation où la cible ne bouge pas et le couteau la tue.


La prédiction alambiquée

car la vitesse à laquelle le couteau tourne est hors du contrôle du joueur.

C'est vrai. C'est hors du contrôle du joueur. Cependant, pas hors de votre contrôle ...

Si vous pouvez calculer la distance que le couteau doit parcourir, vous pouvez faire le taux de rotation de telle sorte que le couteau frappe la lame en premier.

Maintenant, cela n'a pas de sens de faire cette prédiction en plein vol, car le couteau devrait s'ajuster si un obstacle se mettait en travers. Par conséquent, vous le feriez lorsque vous lancez.

Le fait que vous devez suivre un chemin parabolique pour atteindre le test le rend plus compliqué qu'un simple lancer de rayons. Je suggérerais d'obtenir l'équation du mouvement parabolique qui correspond au lancer du couteau et de l'évaluer à intervalles donnés.

Il est également possible de trouver la distance des obstacles à la parabole, en trouvant le point le plus proche dans la parabole de la position de l'obstacle, puis d'effectuer un contrôle de collision avec ce point.

Une fois que vous savez combien le couteau a à parcourir, vous pouvez le diviser en un nombre entier de rotations, de sorte qu'il frappe la lame en premier. Edit: ou un entier 0,5 selon la façon dont vous lancez.

Bien sûr, les obstacles se seraient déplacés au moment où le couteau arrivera…


Être réaliste

Vous ne ferez pas frapper la lame à 100% en premier, en particulier avec des cibles en mouvement. Adoptez-le, un couteau de lancer n'est pas une arme fiable. Ayez donc l'alternative de le faire rebondir quand il touche la poignée en premier. Vous pouvez d'abord vérifier s'il a touché la poignée en vérifiant son orientation et en la comparant à la direction du point de collision.

Theraot
la source
1
Ah, je n'ai pas vu la coupe du saut, comme c'est intelligent mais si simple. C'est très évident quand je l'ai regardé image par image comme vous l'avez suggéré.
FrontEnd
14

Si vous savez à l'avance où le couteau atterrira - comme dans ces séquences de caméras à tuer, qui sont certainement produites après coup - calculez simplement la bonne vitesse de rotation en fonction de la distance de vol et du nombre de rotations souhaitées. Les couteaux de lancer quittent le lanceur la poignée en premier, il doit donc faire pivoter N + 0,5 tours complets 1 , où N est généralement d'au moins 1 mais pourrait être plus basé sur le niveau de compétence du lanceur ou sur la fraîcheur que vous souhaitez lui donner: plus de tours = plus cool.

Si vous ne le faites pas, vous pouvez tricher en fixant la rotation au toucher et peut-être la cacher avec des éclaboussures de sang. Comme un magicien, si vous le faites assez rapidement, le joueur ne le remarquera pas.

Bien sûr, rien de tout cela n'est réaliste. Dans la vraie vie, lancer un couteau est vraiment difficile et nécessite beaucoup de pratique si vous voulez que le couteau atterrisse en premier. Le lanceur doit être pleinement conscient de la distance et modifier son lancer en conséquence, sinon le couteau frappera la poignée en premier.

1 : Il existe également des styles où le couteau passe en premier.

congusbongus
la source
4
+1: éclaboussures de sang. Bon, tours de magie. Edit: ou un nuage de poussière pour l'édition non gore.
Theraot
2
@Theraot et / ou accélèrent la vitesse de rotation pour que le spectateur ne puisse pas vraiment suivre la direction dans laquelle il est dirigé.
Perkins
14
  1. Calculez la distance en ligne droite à cibler.

  2. Chaque cadre définit l'angle du couteau à 2PI * (restantStraightLineDistance) / (originalStraightLineDistance) * DesiredNumRotations.

Le rapport de rotation variera légèrement si vous ne déplacez pas le couteau en ligne droite, mais personne ne le remarquera jamais.

Si vous ne prédéterminez pas la cible (c'est-à-dire que vous lancez et utilisez simplement la physique pour voir ce qu'elle frappe), vous devrez truquer cela, mais vous pouvez utiliser le même principe de regarder quelle cible elle est susceptible de toucher et ajuster le spin pour être correct pour cette cible.

Tim B
la source
4

Les vrais couteaux de lancer sont conçus pour avoir une très grande chance de frapper la lame en premier. Concevez vos couteaux en conséquence.

Collection de couteaux à lancer de Wikipédia : Collection de couteaux à lancer de wikipedia

Vous voulez que le centre de masse, et donc le centre de rotation, le plus loin possible de la pointe de la lame . Cela augmentera les chances que la lame tourne en position de frappe avant que l'extrémité de la poignée ne s'y rende.

La lame est généralement longue et mince, pour dépasser le plus possible du centre de masse tout en ajoutant le moins de masse possible. De plus, il y a un contrepoids souvent en forme de disque ou sphérique à l'extrémité de la poignée, ce qui est intéressant, je ne le vois dans aucun des couteaux de l'image Wikipedia.

Le couteau est projeté en tenant la pointe de la lame et en arquant la poignée dans le sens du lancer.

dotancohen
la source
2

Pour une méthode "fumée et miroirs", vous pouvez avoir le centre de rotation du couteau (c'est-à-dire le centre de masse) près de la poignée (c'est-à-dire la partie non pointue). De cette façon, si la vitesse de rotation est suffisamment élevée par rapport à la vitesse du couteau, il peut être garanti que la pointe de la lame heurtera la cible et aucune autre partie.

Il y a un calcul à obtenir, qui est la vitesse de rotation minimale compte tenu du centre de masse et des dimensions, mais devrait être simple. Notez également que cela n'implique rien sur l'angle du coup.

Guido
la source
1

Lanceur de couteau parfait?

En ce moment, vous dites que vous faites tourner le couteau grâce à l'animation. Quel paramètre utilisez-vous pour contrôler l'angle? Numéro de cadre? Temps de jeu? Mise à l'échelle par une vitesse de rotation arbitraire?

Si à la place vous utilisiez le paramètre (distance parcourue) / (distance totale à la cible), avec la mise à l'échelle appropriée par pi et (nombre de tours + 0,5), le couteau arriverait en effet toujours comme par magie en premier.

Neil_UK
la source
La première partie de cette question semble demander des éclaircissements. Cela devrait probablement être fait sous forme de commentaires sur la question. Pourriez-vous élaborer sur la méthode que vous proposez pour arriver en premier par point magique? Par exemple, vous dites "avec la mise à l'échelle appropriée par pi"; quelle mise à l'échelle? Il est juste de supposer que si l'utilisateur doit demander, il peut ne pas comprendre quelle serait la mise à l'échelle appropriée.
Gnemlock
@TimB a mieux expliqué cela, mais la solution proposée par Neil est une bonne approche. Modifiez la vitesse de l'animation de votre couteau rotatif de sorte que lorsqu'il atteint la cible, le couteau est en position "l'extrémité pointue va dans l'autre homme". C'est beaucoup plus facile (à programmer ET par calcul) que de calculer des trajectoires paraboliques impliquant des cibles en mouvement, etc. S'il s'agit d'une animation d'images clés, il vous suffit de mettre à l'échelle votre index et d'oublier pi.
AC