@@ -122,7 +122,20 @@ \subsection{Cubo}
122122
123123\subsection {Esfera }
124124
125- {\color {red} TODO - Mariana}
125+ As normais da esfera são calculadas de forma muito simples: para cada vértice, a normal é o vetor
126+ que vai do centro da esfera até esse vértice, normalizado. Como a esfera está centrada na origem,
127+ isso equivale a normalizar o próprio vetor posição do vértice. Este método garante que todas as
128+ normais são perpendiculares à superfície.
129+
130+ As coordenadas de textura (u, v) são atribuídas com base na posição angular de cada ponto. O valor
131+ de u varia entre 0 e 1 ao longo da longitude, e o valor de v varia entre 0 e 1 ao longo da latitude.
132+
133+ Nos polos, como existe apenas um vértice em cada um e é necessário ligá-lo a todas as \emph {slices }
134+ ao redor, o mesmo vértice recebe várias coordenadas de textura com valores diferentes de u.
135+ Isto permite `` cortar'' a textura em triângulos que convergem para os polos — como se estes fossem
136+ divididos em pequenas fatias triangulares.
137+ Desta forma, conseguimos aplicar uma imagem 2D na superfície da esfera de forma contínua, repartindo
138+ a textura entre os vários triângulos sem quebras visuais visíveis.
126139
127140\subsection {Cone }
128141
@@ -155,12 +168,47 @@ \subsection{Cone}
155168
156169\subsection {Cilindro }
157170
158- {\color {red} TODO - Mariana}
171+ No cilindro, as normais são definidas conforme a sua geometria:
172+
173+ \begin {itemize }
174+ \item Na base e no topo do cilidro, as normais são verticais: $ (0 , -1 , 0 )$ e $ (0 , 1 , 0 )$ ,
175+ respetivamente.
176+ \item Na superfície lateral, as normais são vetores radiais no plano $ XZ$ , ou seja, $ (x, 0 , z)$
177+ normalizado e apontam para fora.
178+ \end {itemize }
179+
180+ As coordenadas de textura são atribuídas de duas formas, dependendo do modo:
181+
182+ \begin {itemize }
183+ \item No modo simples, as coordenadas da base e do topo são calculadas a partir da posição do
184+ vértice no plano $ XZ$ , centradas em $ (0.5 , 0.5 )$ . Na lateral, o valor de $ u$ varia ao longo da
185+ circunferência e $ v$ varia com a altura.
186+ \item No modo \texttt {multiTextured }, aplicam-se as mesmas regras, mas os valores são ajustados
187+ para percorrer corretamente sobre uma imagem maior que pode conter várias secções, como base,
188+ lateral e topo, numa única textura.
189+ \end {itemize }
159190
160191\subsection {\emph {Torus } }
161192
162193{\color {red} TODO - Sara}
163194
195+ \subsection {Geração de modelos com base em \emph {patches } de Bézier }
196+
197+ Ao gerar uma superfície de Bézier, é necessário calcular as normais e as coordenadas de textura para
198+ cada ponto da malha.
199+
200+ De modo que, as normais são obtidas através do produto vetorial entre as derivadas
201+ parciais da superfície em relação a u e v. Estas derivadas representam os vetores tangentes à
202+ superfície em cada ponto. O produto vetorial desses vetores resulta na normal, que é posteriormente
203+ normalizada. Este processo garante uma correta iluminação durante a renderização do modelo.
204+
205+ As coordenadas de textura são diretamente baseadas nos parâmetros u e v, que variam entre 0 e 1.
206+ Assim, cada ponto da superfície fica mapeado para uma posição correspondente numa imagem de textura.
207+
208+ No entanto, durante o cálculo das derivadas parciais, valores como $ u = 0 $ ou $ v = 0 $ podem
209+ originar problemas numéricos nas fronteiras da superfície. De modo que, para esses casos, são
210+ utilizados valores ligeiramente acima de zero para garantir a estabilidade do cálculo das normais.
211+
164212\subsection {Outras Figuras }
165213
166214Para as restantes figuras, devido à sua complexidade e ao pouco tempo disponível para a conclusão
@@ -282,7 +330,79 @@ \subsection{VBOs}
282330
283331\subsection {Adição ao \emph {Schema } XML }
284332
285- {\color {red} TODO - Mariana}
333+ O \emph {schema } XML foi alargado para suportar materiais com múltiplas componentes de cor, texturas
334+ e fontes de luz diversas. Estas adições permitem um controlo mais detalhado sobre o aspeto visual
335+ dos modelos, a aplicação de texturas e a iluminação da cena.
336+
337+ \subsubsection {Materiais }
338+
339+ Pode ser associado a cada modelo um conjunto de propriedades de material que influenciam a forma
340+ como este interage com a luz. Estas propriedades são definidas no elemento \texttt {<color> }, onde é
341+ possível incluir as componentes \texttt {diffuse }, \texttt {ambient }, \texttt {specular } e
342+ \texttt {emissive }, bem como o valor de \texttt {shininess }. Caso o elemento \texttt {<color> } não
343+ esteja presente, são utilizados valores por omissão.
344+
345+ \ begin{lstlisting} [language=xml]
346+ <model file="sphere.3d">
347+ <texture file="earth.jpg" />
348+ <color>
349+ <diffuse R="200" G="200" B="200" />
350+ <ambient R="50" G="50" B="50" />
351+ <specular R="0" G="0" B="0" />
352+ <emissive R="0" G="0" B="0" />
353+ <shininess value="0" />
354+ </color>
355+ </model>
356+ \end {lstlisting }
357+
358+ Estas propriedades são processadas na classe \texttt {Material }, que interpreta os valores a partir
359+ do XML através de funções auxiliares definidas no módulo \texttt {XMLUtils }. O motor de renderização
360+ utiliza depois estes parâmetros para configurar o shader correspondente.
361+
362+ \subsubsection {Texturas }
363+
364+ Caso o elemento \texttt {<texture> } esteja presente, é carregado o ficheiro de textura especificado
365+ e aplicado ao modelo 3D. A ausência deste elemento implica que o modelo será renderizado apenas com
366+ base nas cores definidas no material.
367+
368+ \ begin{lstlisting} [language=xml]
369+ <model file="cylinder.3d">
370+ <texture file="metal.jpg" />
371+ </model>
372+ \end {lstlisting }
373+
374+ No carregamento da cena, o caminho da textura é resolvido com base no diretório do ficheiro XML, e
375+ a imagem é carregada para memória. O motor assegura que a mesma textura não é carregada múltiplas
376+ vezes, reutilizando instâncias já existentes. Esta otimização é feita através de um \texttt {map }
377+ que armazena texturas já processadas.
378+
379+ \subsubsection {Iluminação }
380+
381+ Foi também introduzido suporte para os diferentes tipos de luzes: pontuais, direcionais e
382+ \emph {spotlights }. Todas as fontes de luz devem ser declaradas dentro do elemento \texttt {<lights> }
383+ no ficheiro XML da cena. Cada elemento \texttt {<light> } possui um atributo \texttt {type } e
384+ argumentos adicionais consoante o tipo de luz especificado:
385+
386+ \begin {itemize }
387+ \item \texttt {point }: requer os atributos \texttt {posX }, \texttt {posY }, \texttt {posZ } (posição);
388+ \item \texttt {directional }: solicita \texttt {dirX }, \texttt {dirY }, \texttt {dirZ } (direção);
389+ \item \texttt {spotlight }: necessita da posição, da direção e o ângulo de corte
390+ (\texttt {cutoff }).
391+ \end {itemize }
392+
393+ \ begin{lstlisting} [language=xml]
394+ <lights>
395+ <light type="point" posX="0" posY="10" posZ="0" />
396+ <light type="directional" dirX="1" dirY="1" dirZ="1"/>
397+ <light type="spotlight" posX="0" posY="10" posZ="0"
398+ dirX="1" dirY="1" dirZ="1"
399+ cutoff="45" />
400+ </lights>
401+ \end {lstlisting }
402+
403+ A criação dinâmica das instâncias de luz é realizada pela \texttt {LightFactory }, com base no
404+ atributo \texttt {type }. Cada instância herda da interface \texttt {Light }, e é posteriormente
405+ adicionada à lista de luzes da cena.
286406
287407\subsection {Texturas e Iluminação }
288408
0 commit comments