[Pdmtl] GLSL, chainage de shader et alpha : homographie
Sebastien Roy
roys at iro.umontreal.ca
Wed Apr 8 18:32:56 EDT 2009
Bonjour à tous,
La déformation obtenue quand on projète un rectangle sur un mur à partir
d'un projecteur mal aligné est un quadrilatère plus général qu'un
trapèze. La déformation peut s'expliquer par une relation simple:
x' = (a*x + b*y + c)/(i + g*x + h*y)
y' = (d*x + e*y + f)/(i + g*x + h*y)
où (x,y) sont les coordonnée du rectangle et (x',y') les coordonnées
déformées. Certains reconnaitrons une homographie, c'est à dire qu'on
peut écrire:
u a b c x
v = d e f . y
w g h i 1
avec x' = u/w et y' = v/w
Evidement, (a,b,c,d,e,f,g,h,i) dépend de la déformation.
Par exemple, si on veut déformer un carré formé par les points (0,0)
(1,0) (1,1) (0,1) vers un carré dont le coin (1,1) est déplacé en (2,2),
on obtient la matrice (a,b,c,d,e,f,g,h,i) = (2,0,0,0,2,0,-1,-1,3), ce
qui donne:
x' = (2*x)/(3 - x - y)
y' = (2*y)/(3 - x - y)
Evidement, la question est: comment trouver l'homographie
(a,b,c,d,e,f,g,h,i) si on connait 4 points de départ (pas nécessairement
un carré) et les 4 points correspondants déformés.
Je l'ai codé dans Lighttwist pour adapter des projections à des surface
planes. Je peux fournir les détails si il y a des intéressés.
Notez que le grand avantage des homographies est qu'on peut mettre ça
dans une matrice openGL et magiquement tout est déformé. Pas besoin de
vertex shader ou fragment shader pour ça.
Sincèrement,
Sébastien
Mathieu Bouchard a écrit :
> On Wed, 8 Apr 2009, Oli44 wrote:
>
>> il s'agit de faire un rattrapage de trapèze, un effet qui doit jouer
>> en permanence donc, pour avoir une image plane même lorsque la
>> vidéo-projection n'est pas exactement dans l'axe de l'écran. Il
>> s'agit d'une simple correction pas d'un effet à proprement parler.
>> Pour être plus explicite, j'ai inséré un petit svg qui explicite la
>> manipulation.
>
> Un trapèze ça a deux côtés parallèles. Donc tu veux qqchose pour les
> quadrilatères quelconques. Ça se fait mais c'est plus complexe qu'avec
> un trapèze.
>
> Dans le cas d'un trapèze, disons avec deux côtés le long des x, alors
> on peut exprimer les deux autres côtés en tant que fonctions de y:
>
> x0(y) = a0*y + b0 (gauche)
> x1(y) = a1*y + b1 (droite)
>
> et alors si on dit u,v pour dire les x,y originaux, et que y=v (càd on
> change pas les y), et que u=0...1, alors
>
> x(u,y) = u*(x1(y)-x0(y)) + x0(y)
>
> donc on voit qu'il y a un facteur d'étirement de x1(y)-x0(y) qu'il
> faut compenser en mettant un facteur d'étirement inverse
> 1/(x1(y)-x0(y)) avant de projeter. Ça fait que les deux côtés
> non-horizontaux deviennent courbes (en fait, ce sont des morceaux
> d'hyperboles).
>
> Dans le cas d'un quadrilatère quelconque, il faut faire varier y en
> fonction de v, et donc les formules doivent absolument utiliser v en
> tant que variable et non y, et tous les côtés deviennent courbes.
>
> Mais que ce soit le cas trapèzoïdal ou le cas quelconque, faut pas se
> leurrer: la déformation est pas uniforme du tout (quoique si elle est
> petite, il est possible qu'elle ne paraisse pas beaucoup).
>
> _ _ __ ___ _____ ________ _____________ _____________________ ...
> | Mathieu Bouchard - tél:+1.514.383.3801, Montréal, Québec
> ------------------------------------------------------------------------
>
> _______________________________________________
> Pdmtl mailing list
> Pdmtl at lists.artengine.ca
> http://lists.artengine.ca/cgi-bin/mailman/listinfo/pdmtl
>
More information about the Pdmtl
mailing list