2017-09-27 5 views
0

J'utilise des commandes d'orientation de l'appareil, mais ont besoin des fonctionnalités supplémentaires que je vais avoir des difficultés.Three.js: Utilisation DeviceOrientationControls avec une direction différente de base

Je veux qu'un utilisateur soit capable de « verrouiller » la caméra, ce qui empêche l'orientation de la caméra de changer. Lorsque le déverrouiller, je veux que la vue tourne maintenant la caméra de l'endroit où ils l'ont verrouillé, c'est à dire. Je ne veux pas que l'appareil photo "passe" à une autre orientation, même si l'orientation de son téléphone a changé pendant que la vue était verrouillée.

Voici le code pour la version modifiée de DeviceOrientaionControls.js: https://gist.github.com/BruOp/a3fb2f0854357eb1182671cafd3fae89

Les éléments essentiels sont en update, disconnect et reconnect.

Je bascule l'orientation (appelez-le lockedRot) que l'utilisateur voit quand il se "verrouille", puis prend l'orientation de l'appareil lorsqu'il est "déverrouillé" (unlockedRot). Je trouve donc le quaternion deviceToPercieved tel que:

deviceToPercieved * unlockedRot = lockedRot

Mais ce n'est pas vraiment travailler. Parfois, la caméra ne saute qu'un petit peu lorsqu'elle est déverrouillée, mais d'autres fois, elle ne parvient pas à maintenir l'orientation «verrouillée» entièrement lors du déverrouillage.

Suis-je fait fausse route ici ou suis-je manque quelque chose de plus fondamental?

Répondre

0

J'ai trouvé le problème! C'était juste l'ordre de multiplication lors du calcul du quaternion deviceToPerceived. Il était:

this.deviceToPercieved.multiplyQuaternions(
    this.unlockedRot.clone().conjugate(), 
    this.lockedRot 
).normalize(); 

Mais il devrait en fait être:

this.deviceToPercieved.multiplyQuaternions(
    this.lockedRot, 
    this.unlockedRot.clone().conjugate() 
); 

Notez que le changement dans l'ordre de la multiplication et l'abandon de l'appel normalized().

Il fonctionne correctement maintenant!