J'ai un modèle 3D d'une tourelle qui tourne autour de l'axe Y. Cette tourelle a un canon qui est sensiblement hors du centre de l'objet. Je veux que le canon, pas la tourelle, vise une cible spécifiée. Je ne peux que faire pivoter la tourelle, cependant, et donc je ne sais pas quelle équation je dois appliquer pour accomplir par objectif.
L'image suivante illustre mon problème:
Si j'ai la tourelle "LookAt ()" la cible, un laser provenant du canon manquera complètement ladite cible.
S'il s'agissait d'un scénario complètement descendant et que le canon était exactement parallèle à la tourelle, ma logique me dit que la fausse cible devrait être située à une position égale à la cible réelle plus un décalage égal à celui entre le tourelle et le canon. Cependant, dans mon scénario actuel, ma caméra est inclinée à 60 ° et le canon a une légère rotation.
L'image suivante illustre le scénario:
Je ne sais pas exactement pourquoi, mais si j'applique le même décalage, cela ne semble fonctionner que lorsque l'on vise certaines distances de la tourelle.
Ma logique est-elle défectueuse? Suis-je en train de manquer quelque chose de fondamental ici?
Final Edit: la solution fournie par la dernière mise à jour de @JohnHamilton résout ce problème avec une précision parfaite. J'ai maintenant supprimé le code et les images que j'ai utilisés pour illustrer mes implémentations incorrectes.
la source
Réponses:
La réponse est en fait assez simple si vous faites le calcul. Vous avez une distance fixe de Y et une distance variable de X (voir image 1). Vous devez trouver l'angle entre Z et X et tourner encore plus votre tourelle.
Étape 1 - Obtenez la distance entre la ligne de tourelle (V) et la ligne de canon (W) qui est Y (c'est constant mais cela ne fait pas de mal à calculer). Obtenez la distance de la tourelle à la cible (qui est X).
Étape 2 - Divisez Y par X, puis obtenez le sinus hyperbolique de la valeur
Étape 3 - Tournez beaucoup plus la tourelle (autour de l'axe qui va de haut en bas, probablement vers le haut, mais vous seul pouvez connaître cette partie).
Bien sûr, dans ce cas, vous en avez besoin pour tourner dans le sens antihoraire, vous devrez peut-être ajouter un moins devant le turnAngle là, comme dans
-turnAngle
.Modifié certaines parties. Merci à @ens d'avoir souligné la différence de distance.
L'OP a déclaré que son arme avait un angle alors nous y allons, l'image d'abord, l'explication plus tard:
Nous savons déjà du calcul précédent où viser la ligne rouge en fonction de la ligne bleue. Donc, visons d'abord la ligne bleue:
Le seul calcul qui diffère ici est le calcul de "X Prime" (X ') parce que l'angle entre le canon et la tourelle (angle "a") a changé la distance entre les lignes.
Cette partie suivante est UNIQUEMENT nécessaire si vous faites des pistolets à tourelle modulaires (c.-à-d. L'utilisateur peut changer les pistolets sur une tourelle et différents pistolets ont des angles différents). Si vous faites cela dans l'éditeur, vous pouvez déjà voir quel est l'angle du canon selon la tourelle.
Il existe deux méthodes pour trouver l'angle "a", l'une est la méthode transform.up:
La technique ci-dessus calculera en 3D, donc si vous voulez un résultat 2D, vous devez vous débarrasser de l'axe Z (c'est ce que je suppose où se trouve la gravité, mais si vous n'avez rien changé, dans Unity, c'est l'axe Y qui est vers le haut ou vers le bas, c'est-à-dire que la gravité est sur l'axe Y, vous devrez donc peut-être changer les choses):
La deuxième façon est la méthode de rotation (je pense en 2D dans ce cas):
Encore une fois, tous ces codes vous donneront des valeurs positives, vous devrez donc peut-être ajouter ou soustraire le montant en fonction de l'angle (il y a des calculs pour cela aussi, mais je ne vais pas aller plus loin). Un bon point de départ serait le
Vector2.Dot
méthode dans Unity.Dernier bloc de code pour une explication supplémentaire de ce que nous faisons:
Si vous avez tout fait correctement, vous devriez obtenir une scène comme celle-ci ( lien pour le package d'unité ): Ce que je veux dire par des valeurs toujours positives:
La méthode Z peut donner des valeurs négatives:
Pour un exemple de scène, obtenez le package d'unité à partir de ce lien .
Voici le code que j'ai utilisé dans la scène (sur la tourelle):
Code adapté en 3D avec X et Z comme plan 2D:
la source
Vous pouvez également utiliser une approche plus générale:
Le calcul de votre problème existe déjà sous la forme du produit scalaire (ou produit scalaire) . Il vous suffit d'obtenir les directions de l'axe avant de vos armes et la direction de votre arme vers la cible.
Soit W le vecteur avant de votre arme.
Soit D la direction de votre arme vers votre cible. (Target.pos - Weapon.pos)
Si vous résolvez la formule du produit scalaire
pour alpha, vous obtenez:
Vous n'avez qu'à convertir des radians en degrés et vous avez obtenu votre angle pour faire tourner votre robot. (Comme vous l'avez mentionné, l'arme est inclinée par rapport à votre robot, vous devez donc ajouter l'angle à alpha)
la source
Toutes les réponses publiées jusqu'à présent sont (plus ou moins) fausses, alors voici une solution rapide et correcte:
Pour viser le canon vers la cible, tournez le vecteur de la tourelle vers l'avant vers la cible et ajoutez l'angle θ.
Trouvons donc θ:
Lorsque
δ' = 0
cela se simplifie enθ = asin(a / d)
, ce qui correspond à la première partie de la réponse de John Hamilton.Modifier:
J'ai ajouté un exemple de travail.
Ouvrez dans JSFiddle ou utilisez l'extrait de code intégré ci-dessous:
la source