Place to do random C.G. things and hopefully make tutorials out of them.
A geometria do cilindro é uma bem fácil de fazer. Basta iterar da base até o topo criando os vértices e depois iterar novamente para criar as faces.
Quando queremos iluminar o clindro temos que calcular as normais, sendo que as das faces de baixo apontam todas para -z, as da face de cima apontam todas para +z, e as outras apontam na mesma direção que o próprio vértice em relação à origem.
Já para a texturização começam os problemas maiores. A texturização da lateral do cilindro é bem tranquila, basta mapear a textura linearmente usando coordenadas polares para u, e coordenadas euclidianas para v.
É na base e no topo do cilindro que está 90% do trabalho. O mapeamento das texturas nessas faces não pode ser linear.
Uma das formas de mapear consta em simplesmente ignorar a linearidade, e mapear em forma de triângulos na textura, o que irá jogar fora uma parte da textura.
Infelizmente isso não produz um resultado bom pois a textura fica com várias descontinuidades ao ser mapeada:
Veja o exemplo: Problemas com a face circular
Tentei então fazer o mapeamento considerando a parte externa do círculo como sendo um anel, cobrindo o centro do anel com um círculo menor, de tal forma que as descontinuidades não pudessem ser percebidas.
Isso também tem problemas, agora a textura fica distorcida por causa da forma com que os triângulos são mapeados:
Veja o exemplo: Tentativa de correção com divisão em anel + círculo pequeno
A melhor solução foi criar uma série de anéis concêntricos com um círculo pequeno no centro. Isso ainda deixou alguns traços de distorção, como pode ser visto abaixo:
Veja o exemplo: Correção com divisão em anéis de potências de fração
É possível mitigar essas distorções alinhando as divisões da textura com os triângulos, o que elimina completamente o problema.
Versão final: Texturizando o cilindro
Entretanto, nem toda textura é bonitinha como as que usei aqui. No caso de texturas complicadas o jeito é subdividir em mais e mais partes até que o problema seja imperceptível.
Eu usei algumas texturas que não são minhas nestes exemplos. Aqui estão algumas informações sobre como econtrá-las.
Pesquisas no Google por imagens:
Sites com images para testes de mapeamento de texturas: