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.
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
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
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