Uma Arquitetura de Suporte a Interações 3D ... - DCA - Unicamp
Uma Arquitetura de Suporte a Interações 3D ... - DCA - Unicamp
Uma Arquitetura de Suporte a Interações 3D ... - DCA - Unicamp
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
5.3 Codificação <strong>de</strong> atributos no domínio da imagem 103<br />
mações perspectivas obtidas em Direct<strong>3D</strong> com o comando D<strong>3D</strong>XMatrixPerspectiveLH()<br />
da biblioteca D<strong>3D</strong>X, zwindow é calculado pela equação<br />
<br />
Zf<br />
zwindow =<br />
Zf − Zn<br />
−<br />
<br />
ZfZn<br />
Zfvp<br />
<br />
− Znvp + Znvp. (5.2)<br />
Zeye(Zf − Zn)<br />
Por sua vez, em transformações ortográficas obtidas em OpenGL com o comando glOrtho(),<br />
ou com o comando gluOrtho2D() da biblioteca GLU, zwindow é dado pela expressão<br />
zwindow = 2zeye + Zf + Zn<br />
Zf − Zn<br />
Zfvp − Znvp<br />
2<br />
<br />
+ Zfvp + Znvp<br />
. (5.3)<br />
2<br />
Como regra geral, tanto para transformações ortográficas como perspectivas em OpenGL e Di-<br />
rect<strong>3D</strong>, o primeiro termo entre colchetes nas equações 5.1 e 5.2 é substituído pelo termo obtido<br />
da transformação <strong>de</strong> zeye pela matriz <strong>de</strong> projeção utilizada em cada API. Os <strong>de</strong>mais termos<br />
(com os valores Znvp e Zfvp) são responsáveis apenas pelo mapeamento linear dos valores <strong>de</strong><br />
profundida<strong>de</strong> segundo o alcance <strong>de</strong> profundida<strong>de</strong> <strong>de</strong>finido na API.<br />
Na CPU, este valor <strong>de</strong> profundida<strong>de</strong> po<strong>de</strong> ser utilizado pela aplicação para <strong>de</strong>terminar a posição<br />
<strong>3D</strong> do fragmento <strong>de</strong> superfície em coor<strong>de</strong>nadas relativas ao espaço do objeto. Para isso, obtém-<br />
se a posição 2D do pixel, o valor <strong>de</strong> profundida<strong>de</strong> calculado e a componente <strong>de</strong> coor<strong>de</strong>nada<br />
homogênea, transformando a coor<strong>de</strong>nada homogênea resultante <strong>de</strong> volta ao espaço do objeto<br />
<strong>de</strong> acordo com a transformação inversa das matrizes da janela, projeção, visão e mundo. Em<br />
OpenGL, essa transformação é dada por<br />
⎛<br />
⎜<br />
⎝<br />
xobject<br />
yobject<br />
zobject<br />
wobject<br />
⎞<br />
⎟<br />
⎠ = M −1 P −1 V −1<br />
⎛<br />
⎜<br />
⎝<br />
xwindow<br />
ywindow<br />
zwindow<br />
wwindow<br />
⎞<br />
⎟<br />
⎠ = (P M)−1 V −1<br />
⎛<br />
⎜<br />
⎝<br />
xwindow<br />
ywindow<br />
zwindow<br />
wwindow<br />
⎞<br />
⎟ , (5.4)<br />
⎠<br />
on<strong>de</strong> V é a matriz da janela <strong>de</strong> visualização (viewport), P é a matriz <strong>de</strong> projeção (projection) e<br />
M é a matriz concatenada <strong>de</strong> mundo e visão (mo<strong>de</strong>lview). O procedimento equivalente se aplica<br />
às matrizes <strong>de</strong> transformação da API Direct<strong>3D</strong>. Para transformações perspectivas no OpenGL,<br />
o valor wwindow correspon<strong>de</strong> ao valor negativo da coor<strong>de</strong>nada z do espaço da câmera (−zeye), e<br />
assim po<strong>de</strong> ser obtido <strong>de</strong> zwindow isolando zeye da equação 5.1, como se segue:<br />
zeye = ZfZn(Zfvp<br />
<br />
− Znvp)<br />
zwindow − (Zf + Zn)(Zfvp − Znvp)<br />
2(Zf − Zn)<br />
Zf − Zn<br />
− Zfvp + Znvp<br />
2<br />
−1<br />
. (5.5)<br />
Este procedimento é realizado na CPU pelo comando gluUnProject() da biblioteca GLU