03.04.2013 Views

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

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!