Comment pourrait appeler simplement pitch () et Yaw (), l'appareil photo à terme Roll ()?

StackOverflow https://stackoverflow.com/questions/784445

  •  16-09-2019
  •  | 
  •  

Question

Je suis un codage jeu OpenGL de base et j'ai un code qui gère la souris en termes de déplacement de l'appareil photo.

J'utilise la méthode suivante:

int windowWidth = 640;
int windowHeight = 480;

int oldMouseX = -1;
int oldMouseY = -1;

void mousePassiveHandler(int x, int y)
{
    int snapThreshold = 50;

    if (oldMouseX != -1 && oldMouseY != -1)
    {
        cam.yaw((x - oldMouseX)/10.0);
        cam.pitch((y - oldMouseY)/10.0);


        oldMouseX = x;
        oldMouseY = y;

        if ((fabs(x - (windowWidth / 2)) > snapThreshold) || (fabs(y - (windowHeight / 2)) > snapThreshold))
        {
            oldMouseX = windowWidth / 2;
            oldMouseY = windowHeight / 2;
            glutWarpPointer(windowWidth / 2, windowHeight / 2);
        }
    }
    else
    {
        oldMouseX = windowWidth / 2;
        oldMouseY = windowHeight / 2;
        glutWarpPointer(windowWidth / 2, windowHeight / 2);
    }


    glutPostRedisplay();

}

Cependant, après avoir regardé en rond, vous trouverez la caméra commence à « rouler » (rotation). Depuis que je suis seulement appeler Pitch and Yaw, je ne vois pas comment cela est possible.

Voici le code que je utilise pour ma classe de l'appareil photo: http://pastebin.com/m20d2b01e

Pour autant que je sache, mon appareil photo « rouler » ne devrait pas se produire. Il faut simplement tanguer ou lacet gauche et à droite. Ne roulera pas.

Qu'est-ce que pourrait être la cause?

Était-ce utile?

La solution

Félicitations - vous avez découvert la théorie des groupes de Lie!

Oui, il est possible. Le résultat d'une série de transformations dépend de l'ordre dans lequel ils sont exécutés. Faire un pas suivi d'un lacet n'est pas le même que faire un lacet, suivi par un pas. En fait, dans la limite de infinitésimales pian et emplacements, la différence des montants à un rouleau pur; le général le cas est un peu plus compliqué.

(Physiciens appellent cela les « relations de commutation de le groupe de rotation »).

Si vous êtes familier avec les matrices de rotation, vous pouvez travailler dehors plutôt facilement.

Autres conseils

Vous aurez probablement besoin d'utiliser escouades pour composer des rotations, si vous ne faites pas déjà si . Cela évite le problème de

Voici comment convertir entre eux.

Eh bien, si vous commencez à la recherche horizontale avant vers l'horizon, hauteur de 90 degrés, puis lacet à gauche de 90 degrés, puis plantez en bas de 90 degrés, vous seriez à la recherche dans la même direction que vous avez commencé, mais l'horizon serait être verticale (comme si vous rouliez à 90 degrés à gauche).

Modifier : Je pense que le problème est que lacet / tangage / roulis serait approprié si l'appareil est traité comme un avion. Ce que vous voulez sans doute faire est de traiter comme un point dans une sphère, garder une trace de l'endroit où la sphère vous pointez la caméra. Au lieu de lacet / tangage, utiliser des coordonnées sphériques en gardant une trace de thêta (latitude) et phi (longitude). Ils peuvent sembler similaires, mais considérez le cas extrême où la caméra pointe directement vers le haut. Avec lacet / pas, vous pouvez toujours ajuster librement le lacet et le pas de cette direction droite vers le haut. Avec thêta / phi, vous ne pouvez régler vers le bas thêta, et peu importe la façon dont vous avez réglé beaucoup phi, thêta baisse serait quand même vous donner un appareil photo qui est parallèle à l'horizon. Voici comment le travail de la caméra FPS (vous ne pouvez pas regarder si loin que vous êtes à la recherche derrière vous).

Edit 2 : En regardant le code de caméra lié à, vous voulez être en utilisant le rotLati(float angle) et rotLongi(float angle) Fonctions

Mathématiquement la raison est que les rotations dans l'espace 3D ne commutent pas. Ce que cela signifie est que pas () suivi de lacet () ne sont pas les mêmes que lacet () suivi par la hauteur (), mais une conséquence de ce fait est que les trois types de rotations sont inextricablement liés et vous ne pouvez pas effectuer deux d'entre eux sans obtenir une partie de la troisième. En d'autres termes, toute séquence de pas (s) et de lacet () s produira un effet notable rouleau () au fil du temps, à moins que la seconde moitié de la séquence est l'inverse exact de la première moitié. (Il y a beaucoup de mathématiques assez complexes impliqués dans ce domaine, mais les détails ne sont pas particulièrement pertinentes)

tangage / lacet / roulis sont tous par rapport à l'orientation de votre véhicule. Lorsque vous plantez haut / bas, vous changez votre axe de lacet. De même, lorsque vous lacet, vous changez votre axe de tangage. Il est donc possible de changer l'orientation d'une manière similaire à une manoeuvre de roulis juste par une combinaison et de tangage et lacet manœuvres.

Je crois que cette circonstance est appelée Gimbal verrouillage - il y a un exemple de celui-ci avec des illustrations sur la page wikipedia.

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