2016-06-06 1 views
0

ContexteConversion Angles d'Euler à XYZ coords pour VR

Je suis en VTK KiwiViewer source sur mon appareil mobile et je l'utilise pour faire des scènes VR en utilisant des nuages ​​de points où les actes de téléphone de l'utilisateur que les lunettes VR.

Je reçois attitude de CMDeviceMotion qui me fournit Euler Angles pour les axes x, y et z (respectivement pitch, roll et yaw).

Je suis en train d'obtenir une expérience Google Cardboard sans tirer parti du SDK carton. Raison d'être parce que Kiwi importera déjà tous les modèles dont j'ai besoin pour les tests.

Scénario

Kiwi utilise un système de coordonnées XYZ pour Position de la caméra et Point focal. Voici les trois objets que vous avez à travailler pour positionner la vue VR:

  • Point focal: xyz du point de l'appareil photo est à la recherche à
  • Position de la caméra: xyz où l'appareil est en 3d espace
  • caméra Up: relative xyz pour contrôler la rotation de la caméra

pour l'instant, je suis en train de toujours Position de caméra au 0,0,0. J'utilise sin/cos avec angles d'Euler * 10 pour placer les point focal 10 unités de la caméra. Réglage du Position de la caméra et La position du point focal est réglée automatiquement Camera Up pour une valeur correcte utilisable.

Réglage du point focal

x = -(sin(roll) * cos(pitch)) * 10; 
y = cos(roll) * sin(pitch) * 10; 
z = sin(yaw); 

setCameraFocalPoint(x, y, z); 

Question

Ma configuration actuelle fonctionne bien, mais il a quelques bizarreries désagréables. Comment puis-je modifier ma conversion pour obtenir une expérience VR plus solide?

Répondre

1

Vous devez savoir, quelle convention les angles d'Euler sont faits pour (X * Y * Z est commun, mais votre SDK peut utiliser un autre). Ensuite, recherchez le according rotation matrix. Votre direction d'affichage sera la dernière colonne de cette matrice (ou son inverse si vous utilisez des systèmes de coordonnées droitiers). La direction haute sera la deuxième colonne.

Si votre SDK vous permet de définir la matrice de vue directement, vous pouvez utiliser la matrice de rotation transposée (et ajouter une quatrième ligne et une colonne de zéros et m44=1).

+0

J'ai exploité [cette réponse] (http://stackoverflow.com/a/1569893/332578) pour accomplir ce que vous avez mentionné ici.J'ai essayé tous les 6 styles de matrices mentionnés et je suis toujours confronté à des problèmes similaires où ils fonctionnent mais il y a des problèmes. Des idées? – Jacksonkr

+0

Etes-vous sûr que ceux-ci ne sont pas causés par le capteur? Mettez-vous aussi à jour le haut-vecteur? –

+0

Les valeurs des capteurs sont vérifiées. Je ne mets pas à jour le vecteur * camera up * car cela a plus à voir avec l'orientation de la vue. Ce que j'ai remarqué, c'est que certaines valeurs vont de -PI à PI traversant 0 deux fois dans une rotation de 360 ​​°. À 180, la caméra VR revient de la même façon, ce qui me fait penser que je reçois une sorte de valeur absolue (pas exactement, mais j'espère que vous ressentez mes pensées). – Jacksonkr