2010-12-29 4 views
1

J'essaie de m'imprégner de l'espace tangent et je commence à poser des questions que je ne peux pas poser à mes collègues parce qu'ils commencent à n'en avoir aucune idée de quoi je parle. J'essaie de faire un mapping normal sur opengl. Mon plan actuel est de calculer la matrice tangente-bitangente-normale dans un shader de géométrie.Graphiques 3D, vecteurs unitaires et matrices orthogonales

  1. Lorsque j'ai une matrice orthogonale (tels que la matrice TBN) et je laisse opengl interpoler il entre les sommets, sont les trois vecteurs résultants (T, B et N), puis encore de longueur unitaire? sont-ils toujours à un angle de 90 degrés l'un par rapport à l'autre?
  2. Lorsque je multiplie mon échantillon de carte normale (longueur unitaire) par ma matrice orthogonale, le résultat est-il également garanti? Je pense que c'est mais ne peut pas raisonner à travers cela.
  3. Je pensais à l'utilisation de cartes normales de détail de sorte que les objets proches ne soient pas aussi mauvais qu'ils le font maintenant. Cela voudrait dire qu'il y a alors deux cartes normales. Comment puis-je combiner les deux échantillons?

Pour répondre à ma propre question, un collègue est venu travailler sur le # 2 et il est venu avec une preuve élégante. C'est un peu trop à taper ici mais il suffit de dire que c'est vrai.

Répondre

1

Comme il n'y a pas encore des réponses complètes, je me suis dit que j'aurais un aller à elle:

1) Non et non. Imaginez trois vecteurs v1, v2 et v3 qui sont orthogonaux par paire et de longueur unitaire. Alors bien sûr, -v3 est la longueur de l'unité et également orthogonal à v1 et v2. Maintenant, imaginez les matrices A=(v1|v2|v3) et B=(v2|v1|-v3). Si vous interpolez entre les deux, vous obtiendrez C=((v1+v2)/2|(v1+v2)/2|0) juste au milieu. Il est facile de voir que cela ne maintiendra pas la longueur: (0 0 1)^T deviendra le vecteur zéro. De plus, les première et seconde colonnes seront égales, ce qui signifie que leur angle est de 0 °. En pratique, cependant, les deux matrices que vous allez interpoler ne seront généralement pas assez différentes pour une telle dégénérescence. c'est si votre surface est orientable.Les surfaces sont orientables si vous pouvez définir un intérieur cohérent et extérieur sur eux. La bande de Moebius est un contre-exemple commun! Une façon légèrement plus correcte serait d'interpoler les rotations (encore une fois, la surface doit être orientable): vous pouvez utiliser l'interpolation sphérique (google!) Ou l'interpolation normalisée (interpoler les matrices et orthogonaliser, mais cela échouera également avec certains cas marginaux). Cependant, les deux interpolations peuvent être coûteuses - et en pratique, les gens transforment simplement la source lumineuse en coordonnées TBN des sommets et utilisent une interpolation linéaire (ce qui revient à utiliser simplement l'interpolation linéaire sur les matrices TBN).

2.) Certainement oui. En fait, cela fonctionne pour n'importe quelle longueur, pas seulement une. Les matrices orthogonales induisent des cartographies isomorphes, qui préservent à la fois les longueurs et les angles entre les vecteurs. Les deux types de transformations que vous pouvez définir à l'aide de telles matrices sont les rotations et les miroirs, qui le montrent intuitivement.

3.) Personnellement, je voudrais simplement ajouter les deux, puis renormaliser. Le Mipmapping supprime généralement les normales de la distance car les normales deviennent plus courtes pendant la moyenne. Bien sûr, vous pouvez renormaliser les normales dans la génération de mipmapping, mais je laisserais cela de côté pour éviter les alias et faire fonctionner cet effet. Autre que cela, c'est essentiellement une question de goût (et regarde!) Comment vous combinez les deux. Pour être honnête, c'est probablement une meilleure façon de ne pas utiliser du tout normalmaps et d'utiliser des textures de plus haute résolution. Le matériel graphique a assez de RAM pour des choses simples comme ça de nos jours, et vous pouvez toujours diffuser des choses si vous pensez que la RAM devient un problème.

1

1) Non et Oui. Si vous interpolez linéairement cette matrice, les vecteurs résultants seront toujours orthogonaux. Les grandeurs seront inférieures à 1 entre la matrice de départ et la matrice de fin. Vous pouvez voir cela en interpolant les vecteurs de (1,0,0) à (-1,0,0) où, à un certain point, la longueur est en fait nulle - c'est un cas que vous ne devriez pas rencontrer avec ce que vous faites, mais il montre les changements de longueur.

Si les lignes et les colonnes sont des vecteurs unitaires orthogonaux, il s'agit d'une matrice orthogonale. Lors de l'interpolation d'une matrice orthonormale à une autre, les intermédiaires auront des lignes et des colonnes orthogonales, mais pas de longueur unitaire. Je crois que l'exigence est que les vecteurs dans la matrice ont tous la même longueur pour que cela fonctionne, mais pas nécessairement la longueur de l'unité.

2) Un vecteur unitaire multiplié par une matrice orthonormale sera de longueur unitaire. Vous faites vraiment une rotation dans un autre cadre de référence. Si les vecteurs dans la matrice sont ortho mais pas normaux, votre vecteur sera réduit par cette même fraction.

3) Si vous souhaitez remplacer une carte par une autre, il suffit d'interpoler entre ces LOD en utilisant une fonction de distance par rapport à la visionneuse. Malheureusement, cela entraînera un raccourcissement du vecteur (le résultat ne sera pas la longueur de l'unité).

Vous devriez être capable d'interpoler la carte normale, appliquer le résultat en utilisant la matrice interpolée (sans renormalisation), et renormaliser seulement le vecteur résultant final.

+0

Il n'y a pas de matrices orthonormales, seulement des ensembles orthonormés de vecteurs. Si les vecteurs ligne/colonne d'une matrice sont orthonormés, la matrice est orthogonale (sic!)! Ce n'est pas suffisant si les vecteurs sont simplement orthogonaux entre eux. – ltjax

+0

Vous avez raison. Je ai googlé un peu et trouvé orthogonal pour signifier ce que j'ai appelé orthonormal. Malheureusement dans ma réponse je distingue deux types de matrices en utilisant ces termes :-) – phkahler

+0

Oui, mais cette chose d'interpolation n'est pas correcte non plus. Les vecteurs de colonne ne resteront pas orthogonaux pendant l'interpolation: imaginez quelques vecteurs de colonne orthonormés v1, v2 et v3. Maintenant, interpolez entre les matrices (v1 | v2 | v3) et (v2 | v1 | -v3). Il est facile de voir que la première et la deuxième colonne seront identiques quand vous interpolez avec alpha = 0.5, et c'est tout sauf orthogonal. – ltjax

Questions connexes