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
la source
Réponses:
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
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.
la source
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.
la source
Calculez la distance en ligne droite à cibler.
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.
la source
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 :
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.
la source
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.
la source
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.
la source