0
votes

Unity: Impossible d'obtenir l'axe Z de l'objet pour se verrouiller face à la caméra

Je veux un sprite pour toujours faire face à la caméra, sauf dans l'axe Z. Mes Sprites continuent de basculer à gauche ou à droite lorsque je déplace la caméra et je ne peux pas l'avoir.

J'ai googling cela pendant des heures. J'ai essayé transform.lookat ou quaternion.lookrotation et réglage manuellement le z à 0, mais pour une raison quelconque, la Z continue à se régler. J'ai vu et essayé tant de solutions qui ont l'impression de travailler mais ne le font pas. Si cela importe, mon sprite est un enfant d'un autre objet, mais essayer la localisation ne fonctionne pas non plus. La congélation des contraintes de corps rigides n'a également aucun effet.

Le plus précis que je peux obtenir, c'est ceci: xxx

avec cela, je peux obtenir le sprite pour faire face à la caméra, mais l'axe Z refuse de rester à zéro.


1 commentaires

Veuillez noter que vous ne devriez pas modifier les valeurs de quaternion elles-mêmes, car le calcul complexe de cette classe. Vous devriez lire le tutoriel de l'unité sur les quaternions


3 Réponses :


0
votes

Avez-vous essayé des contraintes de rotation?

https://docs.unity3d.com/manual/class-rotationconstraint.html


2 commentaires

Je suis nouveau à ceux-ci. J'ajouais un, activé-le, enfermé, a gelé la contrainte Z. Aucun effet. Également essayé d'ajouter la caméra comme source. Rien.


Les contraintes de rotation ne fonctionnent pas s'il modifie la rotation via le code, ils ne les contraintes que du fait des actions basées sur les physics. Où est-il définissant directement la transformation.rotation qu'il n'aura aucun effet.



0
votes

J'ai eu un problème similaire, où je voulais que certains textes 3D recherchent toujours, mais tournent à la caméra.
Ce qui a fonctionné pour moi, définissez les composants d'Euler indésirables à zéro après l'application de la rotation de Lookat.
Dans votre cas, ce serait quelque chose comme ça. xxx

Si vous avez besoin d'une autre valeur Z, remplacez simplement le 0.


11 commentaires

Voulez-vous dire transformer.rotation.eulérangles? Je ne vois pas juste Euler. Malheureusement, cela n'a pas fonctionné, z tourne toujours.


Ah oui, j'ai écrit le code du sommet de ma tête. Corrigé. Êtes-vous sûr qu'aucun autre composant n'affecte-t-il la coordonnée Z? Ce code définit la coordonnée Z sur 0, si cela ne reste pas zéro, je soupçonne que quelque chose d'autre est interférant. Essayez de le déboguer, testez si les Eulerangles.z sont réellement 0 après le code.


`Transform.lookat (cam.transform.position); Vector3 Rot = Transform.Rotation.eulérangles; transformation.rotation = quaternion.euler (rot.x, rot.y, 0); Debug.log ("Euler" + transform.rotation.rotation.eulérangles.z); `Cela génère parfois zéro et génère parfois un numéro comme 6.66031E-06. Je ne sais pas quoi d'autre pourrait l'affecter. Le parent ne tourne pas.


Un numéro comme 6.66031e-06 n'est qu'une erreur de précission numérique. Il peut être considéré comme 0 dans ce cas. Essayez de supprimer / désactiver tous les autres scripts et vérifiez si cela résout le problème. Vérifiez également le reste de votre code, faites-vous quelque part référence à cet objet et modifiez-le? Êtes-vous quelque part modifier son parent? La physique est-elle active sur cet objet?


J'ai désactivé le script que ce code est présent et les valeurs ne changent plus, je pense donc qu'il est prudent de supposer qu'il s'agit de la seule rotation de la modification du code. De plus, le parent ne tourne pas une fois instancié.


Lorsque la transformation indique que le composant z n'est pas 0 (pas aussi presque 0 comme 1E-06), alors quelque chose la modifie. Si ce n'est pas un autre script, c'est ce script. Le débogage vous a montré que la coordonnée Z est définie correctement. Vous pouvez donc vérifier votre script pour d'autres endroits où la rotation est modifiée?


J'ai mis à jour ma question à inclure tout mon script. Actuellement, la seule ligne qui affecte la rotation est la transformation.lookat.


Vous mettez à jour la balance locale après avoir changé la rotation du monde. Cela peut avoir une incidence sur la rotation locale. Essayez de déplacer la partie de mise à l'échelle au-dessus de la partie rotation.


Pas de changement malheureusement.


Ensuite, je suis tout à fait à ma fin de Witts. Je crois que c'est une question très spécifique qui nécessite beaucoup de débogage. Peut-être devriez-vous ouvrir un rapport de bogue ou demander sur le forum de l'unité et fournir des informations sur la scène étendues (hiérarchie, code, etc.) ... bonne chance


Très bien, je vais voir ce que je peux faire. Merci d'avoir essayé d'être ami.



1
votes

Spécial remerciement à Starmanta pour avoir répondu à cette question sur les forums de l'unité.

"Ok, je pense que je vois ce qui se passe. Ils semblent être tournés sont, je pense, une illusion; je pense qu'ils sont vraiment avec précision pointant à la caméra et à droite. Mais, vous traitez la caméra comme s'il a une projection ronde / fisheye, quand il a réellement une projection rectiligne. Cela n'a généralement pas d'importance mais dans ce cas. Il est difficile d'expliquer exactement comment cela affecte cela, mais le résultat est que, lorsque des choses qui sont de part et d'autre du centre de l'écran sont définies pour "regarder vers" la caméra, elles semblent réellement être tournées autour de leurs axes y. p>

La solution à ceci est en fait ennuyeusement simple: ne réglez pas la rotation pour regarder la caméra, définissez-la comme la même que la caméra. " P>

transform.rotation = cam.transform.rotation;


0 commentaires