2016-02-29 1 views
0

J'ai essayé de poster ceci dans les forums de l'unité, mais il a été bloqué en attente de modération, donc je le poste ici dans l'espoir d'obtenir des commentaires plus immédiats.Faire correspondre la rotation d'un objet à la rotation relative d'un autre objet

J'ai 4 objets, deux plans et deux flèches. Une flèche pointe sur l'un des plans, et je veux que la seconde flèche corresponde à la première flèche, mais par rapport au deuxième plan. Ce que je veux dire par là, c'est que si la première flèche est déplacée d'une unité vers la droite par rapport au premier plan, la deuxième flèche devrait se déplacer d'une unité vers la droite par rapport au deuxième plan. J'ai obtenu les positions pour travailler correctement, mais je ne peux pas comprendre comment faire correspondre les rotations. Certains axes de rotation fonctionnent correctement, mais une fois que l'un des plans est tourné, la rotation de la seconde flèche est plus désynchronisée que la première.

Voici le code que j'utilise pour tester cela, le mieux que je pouvais comprendre:

[ExecuteInEditMode] 
public class RotationTest : MonoBehaviour 
{ 
    public GameObject target; 
    public GameObject camera; 
    public GameObject arrow; 

    void OnWillRenderObject() 
    { 
     if (!target || !camera || !arrow) return; 

     arrow.transform.position = target.transform.TransformPoint(transform.InverseTransformPoint(camera.transform.position)); 
     //arrow.transform.rotation = Quaternion.Inverse(camera.transform.rotation) * transform.rotation * Quaternion.Inverse(target.transform.rotation); 
     //arrow.transform.eulerAngles = new Vector3(arrow.transform.eulerAngles.x, -arrow.transform.eulerAngles.y, arrow.transform.eulerAngles.z); 
     arrow.transform.eulerAngles = (target.transform.eulerAngles - transform.eulerAngles) + camera.transform.eulerAngles; 
    } 
} 

-je mettre ce script sur le premier plan, la première flèche est « caméra », la deuxième l'avion est 'cible', la seconde flèche est 'flèche'. Lorsque les deux plans sont alignés exactement, la seconde flèche doit être exactement la même position et la même rotation que la première. Les lignes commentées sont la première chose que j'ai essayée, la ligne non commentée est la prochaine chose la plus proche que je dois travailler, mais elle ne fonctionne correctement que lorsque les plans sont tournés autour de l'axe Y tourné.

Lorsque les deux plans sont orientés dans la même direction, il suffit de régler la rotation de la deuxième flèche sur la rotation de la première flèche, mais une fois le premier plan tourné, cette méthode s'effondre.

Cela fait un bon bout de temps que j'essaye d'essayer différentes combinaisons de multiplications quaternioniques et de différences d'eulerAngles, mais je n'arrive pas à le comprendre. Toute aide à ce stade est très appréciée.

Modifier: Voici quelques images illustrant ce que je voudrais arriver, et ce qui se passe réellement avec le script actuel: http://imgur.com/a/MVI8x Les trois premières images montrent ce qui se passe lorsque les deux avions ont la même rotation (les positions des flèches et les rotations fonctionnent correctement dans ce cas, comme je l'ai déjà dit). La 4ème image montre ce qui se passe (et devrait se produire) lorsque l'avion tourne autour de l'axe Y. La flèche bleue se déplace et pivote pour regarder le même point sur le plan bleu que la flèche verte regarde maintenant le plan vert. Les deux dernières images montrent ce que fait la flèche bleue , mais comme on peut le voir, elle tourne dans des directions étranges. Je suis en train de tester cela uniquement dans l'éditeur, donc quand je bouge ou que je fais tourner un objet, la flèche bleue répondra immédiatement.

Répondre

0

Vous pouvez toujours définir les rotations de la flèche les unes par rapport aux autres, et tant qu'elles ne sont pas parentales, elles seront toujours exactement égales, tant que les modèles ont été créés avec le même point d'axe et rotation initiale.

public GameObject arrow1; 
public GameObject arrow2; 

void Update(){ 

    arrow2.transform.rotation = arrow1.transform.rotation; 
} 

EDIT: Si qui ne fonctionne pas, comment allez-vous faire tourner la première flèche? Utilise-t-il transform.LookAt?

Lorsque je rencontre des problèmes de rotation, c'est généralement un problème local ou global. Peut-être essayer:

void Update(){ 

    arrow2.transform.localRotation = arrow1.transform.localRotation; 
} 

Ou peut-être que je ne comprends pas ce que vous essayez réellement de réaliser et un diagramme pourrait aider à clarifier.

+0

C'était l'une des premières choses que j'ai essayées, mais cela ne fonctionne que si les deux plans sont orientés de la même manière. Mon problème commence une fois que l'un ou les deux plans sont tournés dans une direction autre que l'axe Y – Incognito

+0

J'ai modifié ma question. Je suis juste en train de bouger manuellement et de tourner la flèche à ce moment juste pour tester (la seconde flèche répond immédiatement), mais finalement ce sera la rotation de la caméra principale qui doit être imitée, mais à ce moment-là cette partie de mon code. – Incognito