Question

J'ai un problème de réflexion et de recherche ici et je ne trouve pas la bonne direction à regarder ... Je cherche à développer un algorithme pour vous déplacer dans une image 360 (Sphère comme) en utilisant le mouvement du périphérique.

Donc, si l'utilisateur pointe le périphérique devant lui, il obtient le point d'origine déterminé de l'image.Alors qu'il déplace l'appareil autour de lui, l'image panoramique se déplace selon elle.

Une idée ou une source que je peux regarder dans?

Merci et bonne chance à tous avec Swift :)

Était-ce utile?

La solution

Je vois deux façons faciles de mettre en œuvre cela sans trop de maths tracas:

  1. Utilisez des angles d'Euler, c'est-à-dire le Propriété rouleau de CMATTITTITITE . Définissez un mappage entre la largeur de l'image et l'angle mesuré et prenez soin de la singularité à 180 ° / -180 °. Inconvénient de cette approche:
    • Danger possible de verrouillage de gimbal lorsque les utilisateurs commencent à déplacer leurs appareils de manière chaotique.
    • La même chose s'applique à l'extensibilité concernant une vue 3D complète.
  2. Utilisez le champ magnétique de CMDevicemotion qui est robuste contre le verrou de Gimbal. Le magnétomètre est un peu plus lent que l'accéléromètre / gyroscope, mais je pense que l'algorithme de fusion de coremotion fournira une estimation raisonnable afin que cela ne soit pas le point. Indressions ici:
    • Le champ magnétique n'est pas toujours disponible ou a tendance à être imprécis de gland.
    • l'extension de la vue 3D pourrait être un problème.
  3. Les deux approches doivent être assez faciles à mettre en œuvre et donc je commencerais par l'un d'entre eux. Si vous souhaitez alors avoir une solution plus sophistiquée, vous devrez plonger un peu plus profondément dans les mathématiques. Dans ce cas, une solution pompeux peut être d'utiliser le périphérique actuel normal (art. Par exemple Recherche de vecteur normal au périphérique iOS ), projetez-le sur le plan de la Terre Suface et prenez le delta des angles pour le panorama cylindrique.

    La projection de la sphère est encore plus facile dans ce cas, car vous pouvez utiliser directement le vecteur nominal.

Autres conseils

Merci à Kay, je pourrais être sur la bonne voie pour atteindre cet effet.

Je fais cette réponse juste pour fournir plus de détails pour ceux qui recherchent la même chose.

Tout d'abord, vous devez créer un objet CMMotionManager.

Utilisez ensuite StartDevicemotionUpdateStoQueue pour gérer les événements de mouvement.

[self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMDeviceMotion *motion, NSError *error) {
    [self processMotion];
}];

Dans ProcessMotion, vous devez simplement obtenir l'attitude basée sur la précédente:

// Get attitude difference with previous one
CMAttitude *currentAttitude = self.motionManager.deviceMotion.attitude;
[currentAttitude multiplyByInverseOfAttitude:self.referenceAttitude];

Grâce à cela, vous connaissez le nouvel angle réalisé par l'utilisateur depuis la dernière mise à jour. Ensuite, là où vous gérez votre vue, vous convertissez le nouvel angle d'Euler en la quantité de pixels dont vous avez besoin pour déplacer votre image. Faites juste attention à un angle d'ûre varie entre -180, 180 et sont donnés dans RAD par Apple.Cela pourrait être pratique:

#define RADIANS_TO_DEGREES(radians) ((radians) * (180.0 / M_PI))

Donc, dans mon cas, je calcule simplement le nouveau décalage X parce que je suis juste en mouvement sur l'axe X.

J'espère que cela aide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top