Skip to content
This repository was archived by the owner on Jun 11, 2025. It is now read-only.

Commit ddc2a95

Browse files
authored
add report: XML, normals and textures coordinates (sphere, cylinder and bezier patches) (#76)
* report XML * normals and textures report * add adjustment to Bezier patches * add pictures * add klein bottle * add result pictures * rename pictures * fix sphere
1 parent ab3a812 commit ddc2a95

16 files changed

Lines changed: 137 additions & 6 deletions

reports/RelatorioFase4.tex

Lines changed: 123 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

166214
Para 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

55.8 KB
Loading
17.5 KB
Loading

reports/res/phase4/KleinBottle.png

12.6 KB
Loading

reports/res/phase4/Sphere.png

103 KB
Loading

reports/res/phase4/Teapot.png

154 KB
Loading
4.78 KB
Loading
4.77 KB
Loading
21.2 KB
Loading
27.2 KB
Loading

0 commit comments

Comments
 (0)