2010-11-03 22 views
6

J'essaie de comprendre la fonction glLookAt.Fonction OpenGL LookAt: le vecteur ascendant est-il arbitraire?

Il faut 3 triplets. Le premier est la position de l'œil, le second est le point où l'œil regarde. Ce point apparaîtra au centre de ma fenêtre, n'est-ce pas? Le troisième est le vecteur «haut». Je comprends la signification du vecteur 'up' s'il est perpendiculaire au vecteur de l'oeil au point de vue. La question est, est-il permis de spécifier d'autres vecteurs pour up, et, si oui, quel est le sens alors? Un lien vers une explication détaillée graphique de gluPerstpective, glLookAt et glFrustum serait également très apprécié. La documentation officielle d'OpenGL ne semble pas être destinée aux débutants.

Veuillez noter que je comprends la signification du vecteur haut lorsqu'il est perpendiculaire au vecteur œil-> objet. La question est de savoir quel est le sens (le cas échéant), si ce n'est pas le cas. Je ne peux pas comprendre cela en jouant avec des paramètres.

+0

Merci beaucoup. Chaque réponse a un peu d'informations utiles. Et ma question est répondue. Merci –

Répondre

10

Il fonctionne tant qu'il est "suffisamment perpendiculaire" au vecteur ascendant. Ce qui compte, c'est le plan entre le vecteur up-vector et le vecteur look-at.

Si ces deux éléments s'alignent, la direction ascendante sera plus ou moins aléatoire (en fonction des très petits bits de vos valeurs), car un petit ajustement de celui-ci le fera pointer vers le haut/gauche/droite du regard. au vecteur.

S'ils ont un angle de séparation suffisamment grand (en mathématique en virgule flottante de 32 bits), cela fonctionnera bien. Cet angle ne doit généralement pas être plus d'un degré ou plus, de sorte qu'ils peuvent être très proches. Mais si la différence est de quelques bits, chaque bit modifié donnera un énorme changement direcitonal.

Cela se résume à la précision numérique.

(je suis sûr qu'il ya plus termes mathématiques & définitions pour cela, mais il a été quelques années depuis le collège .. :)

dernier mot: Si les vecteurs sont parallèles, le Up- la direction est complètement indéfinie et vous obtiendrez une matrice de vue dégénérée.

+0

Merci. Voulez-vous s'il vous plaît regarder mon commentaire à la réponse de theoshman? C'est ce que tu veux dire? –

+0

Ce qu'il dit est que si votre vecteur haut est (0,1,0) et que vous décidez de vous aligner œil et objet de sorte que la normale de l'œil-> objet est (ou très proche de) (0,1,0) vous constaterez que la caméra peut tourner ou tourner dans un angle indéfini. J'ai trouvé que dans la pratique, cela n'arrive pas, je n'ai jamais aligné les deux assez pour entrer dans ce problème. – thecoshman

+0

@Armen: Correct. Et comme cette projection devient plus petite (au fur et à mesure que le vecteur up et lookat devient colinéaire), la direction de projection (ce qui compte) changera brusquement avec de petits changements dans l'un ou l'autre vecteur. C'est seulement alors que vous aurez des problèmes. – Macke

0

Oui. C'est arbitraire, ce qui vous permet de faire «rouler» la caméra, c'est-à-dire d'apparaître comme si la scène tournait autour de l'axe de l'œil.

+0

Je veux dire que je sais que c'est arbitraire tant qu'il est perpendiculaire à l'axe de l'œil, mais qu'en est-il quand il ne l'est pas? Je n'imagine toujours pas la signification ... –

2

Dans ce site, vous avez un grand tutoriel

http://www.xmission.com/~nate/tutors.html

http://users.polytech.unice.fr/~buffa/cours/synthese_image/DOCS/www.xmission.com/Nate/tutors.html

Télécharger les executables et vous pouvez modifier les valeurs des paramètres à la fonction glLookAt et de voir ce qui se passe « dans temps réél".

+0

Merci! C'était vraiment utile! –

+0

Et comme toujours avec le contenu lié: "Erreur 404 - Document introuvable" – Kromster

+1

@KromStern, merci de le signaler. J'ai mis à jour la réponse avec un nouveau lien. – bruno

3

Le vecteur up permet à openGL de savoir de quelle façon vous avez votre appareil photo. Pensez dans le monde réel, si vous avez des points dans l'espace, vous pouvez dessiner une ligne de l'un à l'autre. Vous pouvez ensuite aligner un objet, tel qu'une caméra, afin qu'il pointe de l'un à l'autre. Mais vous n'avez aucun moyen de savoir comment vous devriez faire pivoter autour de cet axe que la ligne fait. Le vecteur haut dicte dans quelle direction la caméra doit se tenir.

la plupart du temps, votre vecteur haut sera (0,1,0), ce qui signifie que l'appareil photo sera tourné comme vous le feriez normalement avec un appareil photo, ou si vous tenez la tête droite. si vous installez votre vecteur (1,0,0), ce serait comme tenir votre tête sur le côté, donc de la base de votre tête vers le haut de votre tête il pointe vers la droite. Vous regardez toujours du même point (plus ou moins) au même point, mais votre 'up' a changé. Un vecteur de regard de (0, -1,0) ferait que la caméra soit à l'envers, comme si vous faisiez une main. D'une façon que vous pourriez penser à ce sujet, votre bras est un vecteur de la position de la caméra (votre épaule) au point de vue de la caméra (votre index) si vous collez votre pouce, c'est votre vecteur haut.

Cette image peut vous aider à http://images.gamedev.net/features/programming/oglch3excerpt/03fig11.jpg

EIDT

Perpendiculaire ou non.

Je vois ce que vous demandez maintenant.Par exemple, vous (10,10,10) regardant (0,0,0) le vecteur résultant pour votre direction de recherche est (-10, -10, -10) le vecteur perpendiculaire à cela n'a pas d'importance dans le but de Si vous vouliez que la vue soit orientée de façon à ce que vous soyez comme une personne normale en regardant un peu vers le bas, mettez-vous en place vecteur (0,1,0) En fait, à moins que vous ne vouliez être capable de rouler l'appareil photo, vous n'avez pas besoin que ce soit autre chose.

+0

Merci beaucoup, mais je ne comprends toujours pas ce qui se passe si le vecteur ascendant n'est PAS perpendiculaire au vecteur d'un oeil à l'autre –

+0

Supposons que A est le plan perpendiculaire au vecteur œil-> objet. Êtes-vous en train de dire que seule la projection sur le plan A d'un vecteur important? –

+0

erm ... laissez-moi réfléchir ici. Oui je pense. Tout ce que je peux dire avec certitude, c'est que les points de l'œil-> sont très raides, le même vecteur haut fonctionne toujours. Je n'ai pas besoin de travailler ce qui est perpendiculaire à mon look vector, si cela est nécessaire pour openGL, alors ça fonctionne pour lui-même (pour vous) – thecoshman

-4

Sortez, regardez la lune. L'horizon est sur le fond. Inclinez votre tête vers la gauche, l'horizon tourne vers la droite. Le vecteur haut est l'orientation de votre tête.

+0

Où que j'incline la tête, le vecteur ascendant sera toujours perpendiculaire au vecteur moi-> moon.Ma question est ce qui arrive quand ce n'est pas –

+0

Je ne sais pas pourquoi vous voudriez le rendre compliqué, mais il calcule sûrement la normale. Il ne serait que hors de contrôle lorsque le vecteur haut correspond au vecteur de vue. –

1

Le vecteur ascendant n'a pas besoin d'être perpendiculaire à la direction de la recherche. Tant que ce n'est pas parallèle (ou très proche d'être parallèle) à la direction regardant, vous devriez aller bien. Etant donné que vous avez un plan de vue normal, N (direction regardant) et un vecteur haut (qui ne doit pas être parallèle à N), UV calcule le vecteur ascendant réel qui sera utilisé dans la transformation de caméra par calculer d'abord le vecteur V = UV - (N * UV) N. V est à son tour utilisé pour calculer le vecteur ascendant réel utilisé en créant un vecteur qui est perpendiculaire à N et V comme U = N x V.