Manual de Apoio 2010
Manual de Apoio 2010
Manual de Apoio 2010
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Determinando a NormalNo caso da Figura 5.21 o vector normal não é tão óbvio.A <strong>de</strong>terminação <strong>de</strong> um vector normal po<strong>de</strong> ser feita utilizando 2 vectores (ou 3 pontos) do plano que representaa superfície (Figura 5.22). O produto vectorial <strong>de</strong>sses vectores é um vector perpendicular à superfície.Tomando o vector V 1 ( P ⃗ 1 P 2 ) e V 2 ( P ⃗ 1 P 3 ), o produto vectorial (V P = V 1 × V 2 ) po<strong>de</strong> ser obtido utilizando afórmula:x P = y 1 × z 2 − y 2 × z 1y P = x 1 × z 2 − x 2 × z 1z P = x 1 × y 2 − x 2 × y 1Mais uma vez, com o fim <strong>de</strong> facilitar o cálculo, foi criado código para facilitar esta tarefa:GLVector v1 = new GLVector (1f, 2f, 3f);GLVector v2 = new GLVector (4f, 5f, 6f);GLVector vp = v1. crossProduct (v2 );O exemplo acima, cria dois vectores (v1 e v2) e utiliza a função crossProduct da instância v1 para criar ovector vp com o resultado do produto vectorial.5.6.1 Configurando uma Fonte <strong>de</strong> luzConhecidos que estão os requisitos para a iluminação <strong>de</strong> polígonos, po<strong>de</strong>mos adicionar luzes ao nosso cenário. Aconfiguração <strong>de</strong> luzes é feita utilizando a função:glLightfv ( int light , int pname , float [] params , int offset );A criação <strong>de</strong> um ponto <strong>de</strong> luz po<strong>de</strong> ser feita da seguinte forma:// na funcao init (...)float [] ambientLight = { 0.1f, 0.1f, 0.1f, 1.0 f };float [] diffuseLight = { 0.4f, 0.4f, 0.4f, 1.0 f };// Configurar e Activar a Luz 0gl. glLightfv ( GL2 . GL_LIGHT0 , GL2 . GL_AMBIENT , ambientLight , 0);gl. glLightfv ( GL2 . GL_LIGHT0 , GL2 . GL_DIFFUSE , diffuseLight , 0);gl. glEnable ( GL2 . GL_LIGHT0 );// na funcao display (...)// Posicionar a luz no cenariofloat lightPos [] = { -50.f, 50.0f, 100.0f, 1.0 f };gl. glLightfv ( GL2 . GL_LIGHT0 , GL2 . GL_POSITION , lightPos );Os arrays ambientLight[] e diffuseLight[] contém o RGBA das componentes ambiente e difusa da luz.O array lightPos[] <strong>de</strong>fine a posição da luz. A posição da luz é <strong>de</strong>finida na Mo<strong>de</strong>lView Matrix uma vez queé um objecto geométrico, daí ser posicionada normalmente na função display(). Quando o último valor daposição da luz é 1f, o array <strong>de</strong>fine a posição da luz, quando o seu valor é 0, a luz encontra-se na direcção dovector lightPos[], mas no infinito.Ao <strong>de</strong>senhar os polígonos dos nossos objectos é necessário <strong>de</strong>finir os vectores normais. Para facilitar o cálculodos vectores normais foi criada uma função na classe GlTools, que po<strong>de</strong> ser utilizada da seguinte forma:// Criar uma lista <strong>de</strong> vectoresGLTVectorList vPoints = new GLTVectorList ();vPoints . add (15.0f, 0.0f, 30.0 f);vPoints . add (0.0f, 15.0f, 30.0 f);vPoints . add (0.0f, 0.0f, 60.0 f);// Obter o vector normal ao planoGLVector vNormal = GlTools . getNormalVector ( vPoints );gl. glNormal3fv ( vNormal . toArray () , 0); // 0 -> ignorarvPoints . draw ();A classe GLTVectorList fornece uma forma simples <strong>de</strong> criar listas <strong>de</strong> vectores. O vector normal po<strong>de</strong> serobtido com a função GlTools.getNormalVector que recebe como argumento a lista <strong>de</strong> vectores criada. Ocálculo é feito com base nos primeiros 3 vectores adicionados na lista. Para utilizar nas funções do OpenGL,53