3

J'essaie d'écrire une application de réalité augmentée. J'utilise la boussole, le gyroscope et les coordonnées GPS pour créer des superpositions. Tout fonctionne très bien, sauf lorsque l'utilisateur quitte le mode portrait. Devrait juste être un problème de trig simple que je ne peux pas comprendre.La trigonométrie de l'iPhone pour traiter l'orientation

Pour déterminer si une coordonnée est dans le champ de vision, j'utilise une valeur d'azimut et d'inclinaison du point central de l'iPhone qui est calculée au début du programme. L'azimut est défini comme mouvement gauche et droit lorsque le téléphone est orienté vers le haut, et l'inclinaison est le mouvement de haut en bas lorsque le téléphone est orienté vers le haut. Je mets à jour cette valeur avec les données du gyroscope et de la boussole lors de la mise à jour. Donc, si je mets correctement à jour l'inclinaison et l'azimut du point central, tout devrait fonctionner.

Le problème est que lorsque l'iPhone est tourné, sa définition de l'azimut et l'inclinaison restent les mêmes, par rapport au téléphone. Donc, l'inclinaison est toujours définie comme jusqu'au sommet du téléphone, même si le téléphone est sur le côté.

Ce que j'ai essayé était de faire quelque chose comme ceci:

self.centerPoint.azimuth = (degToRad(angleX)*cosZ) + (degToRad(angleY)*sinZ); 
self.centerPoint.inclination = (degToRad(angleY)*cosZ) + (degToRad(angleX)*sinZ); 

où degToRad (x) convertit de degrés en radians, COSZ et Sinz sont les cos et sin du z-angle du gyroscope respectivement, et angleX et angleY ​​sont les angles x et y du gyroscope. L'angle X du gyroscope mesure l'angle haut-bas, l'angle Y mesure l'angle gauche-droite et l'angle Z mesure la rotation du téléphone du mode portrait au mode paysage.

Cela ne semble pas fonctionner. Quand je tourne le téléphone sur le côté, l'inclinaison augmente considérablement. Y a-t-il des gens qui peuvent aider?

Je dois ajouter que normalement, en ne considérant que l'orientation portrait, j'ai utilisé: azimut = degToRad (angleX) et inclinaison = degToRad (angleY). Cela fonctionne pour l'orientation portrait. Je devrais juste devoir multiplier ceci par un certain facteur pour expliquer l'angle différent.

+0

Site Apple Stack Exchange? – Shoe

+0

Non, c'est une question de programmation, pas une question de logiciel Apple. –

Répondre

0

Cela fait longtemps que je n'ai pas résolu ce genre de problème, mais s'il ne s'agit que de passer du portrait au paysage, ne pourriez-vous pas échanger les valeurs d'azimut et d'inclinaison si nécessaire? Après tout, ils ne sont tous les deux que des angles calculés de la même manière et c'est seulement l'étiquette qui les rend vraiment différents. Vous pourriez faire mieux de simplement les étiqueter angle1 et angle2 puis d'utiliser l'un ou l'autre dans d'autres calculs en fonction de l'orientation du téléphone.


Mise à jour:

En regardant cette fois, je pense que votre problème est que que vous utilisez le capteur mauvais. Les données du gyroscope renvoie radians/s et est une mesure du taux de rotation que vous ne voulez pas. Au lieu de cela, je pense que vous devez utiliser la mesure d'attitude fournie par CMAttitude. La classe CMAttitude fournit des données pour le roulis, le tangage et le lacet, ce qui vous permettra de calculer l'orientation physique de l'appareil. La méthode multiplyByInverseOfAttitude: semble apporter le changement d'orientation du dispositif entre deux échantillons.

+0

Oui, j'ai pensé à ça. Que faire si le téléphone est à un angle de 30 degrés, mais pas en mode portrait ou paysage?Si tout le reste échoue, je le ferai, cependant. – Mike

+0

Voir ma mise à jour pour une meilleure réponse – TechZen