Computação Gráfica
Esta é a pagina principal de um curso de computação gráfica ministrado em 2013/2 no IPRJ/UERJ, de utilidade geral para a formacao de programadores de nivel intermediario e avancado para desenvolvimento de software multimídia, videogames, interfaces gráficas, dentre outros.
Informacoes gerais
- Instrutor: prof. Ricardo Fabbri, Ph.D.
 - Periodo: 2o. Semestre de 2013, voltado ao 10o. periodo de Engenharia da Computacao
 - Tercas 4pm-6:45pm e Quartas 11:30am-2:10pm, sala 211; Lab Inf 309 Tercas e 307 Quartas
 
Pre-requisitos
O aluno deverá saber conceitos básicos de programação e conseguir aprender linguagens rapidamente sob demanda durante o curso. Experiência prévia com programação orientada a objetos desejável, bem como conhecimento de álgebra linear. A linguagem padrao utilizada sera o Python, sendo C/C++, java e outros tambem utilizados eventualmente.
- Tutorial de Python da Kitware e Google[1]
- Slides extremamente uteis para aprender python cientifico rapidamente
 - Boa visao geral do Python cientifico, iPython, PyLab, NumPy, SciPy, Spyder
 - Complementos ao final com processamento de imagens e processamento paralelo
 - Baixe o arquivo tutorial_slides.pdf[2]
 
 
Conteudo aproximado
- Modelagem e conceitos de computacao grafica no software Blender (tarefa 1)
 - Programacao em Python (incluindo OpenGL) usando a API do Blender (tarefa 2)
 - Game engines: projeto e uso
- Transformacoes geometricas, cameras
 
 - Cor, Luz, modelos de transporte de fotons, fotometria, percepcao
 - Renderizacao estilizada / non-photorealistic rendering - NPR
 - Renderizacao em paralelo com GPU, threads e distribuida (uso e ideias basicas)
 - Itens do livro do Van Dam de acordo com necessidade dos projetos
 
Recursos principais
- Grupo de discussao: uerj.tk
 
Bibliografia
- Biblia do Van Dam: "Computer Graphics: Principles and Practice", 3rd. edition, 2013.
 
- Dupla de livros do Velho, Gomes, Souza e outros:
- "Computer Graphics: Theory and Practice"
 - "Design and Implementation of 3D Graphics Systems"
 - Ainda nao explorei muito esses livros, mas sao muito importantes
 
 
Aulas
Toda aula inicia com um video curto inspirador sobre CG
- Intro & Historia da CG
- Video do sketchpad, blender demo run 2013, etc.
 
 - Transformacoes de objetos e sistemas de coordenadas (ate 2/Out/13)
- Matrizes de rotacao, coordenadas homogeneas e outras transformacoes
 - Modelo geometrico de cameras como sequencia de transformacoes
 - O material foi quase igual ao de Algebra Linear Numerica, porem voltado `a tarefa 1 e ao final das notas, em que os calculos e notacao tiveram que ser refeitos para se adequar a rotacoes em torno de eixos arbitrarios usando apenas matrizes.
 
 - Revisao de python
 - CG 2D e 3D com OpenGL - aula grande! (pdf | keynote)
 - Resumo de programacao blender com python e apresentacao de projetos (5/Nov/13)
 - Cores, Iluminacao, Percepcao (pdf | keynote) - mais de 100MB
- Visao geral dos conceitos de cor e como podem ser aplicados `a CG (6/Nov/13)
 - Aprofundamento: colorimetria, fotometria, iluminacao avancada
 - Calibracao de cores, white balance, filtros, codificacao de imagens 3D, highlights, fenomenos naturais de cor (27/Nov/13)
 - Leitura - Sobre temperatura de luzes que nao emitem como corpo negro [3]
 - Leitura interessante - a cor media das estrelas do universo [4]
 
 - Modelo de geracao de imagens RAW/JPEG em cameras reais para renderizacao realistica: Estudo de Zickler et. al. (10/Dez/13)
 - Medindo luz - fluxo de energia em renderizacao, radiancia, irradiancia, funcao plenoptica - Cap 26.7 do livro (11/Dez/13)
 - (em andamento)
 
Recursos adicionais
- Curso do Van Dam na Brown: http://cs.brown.edu/courses/cs123/
 - Curso de Computacao Paralela do IPRJ: incluindo CUDA
 - Curso de Álgebra Linear Numérica do IPRJ: muitos conceitos úteis para computação gráfica
 - Curso de Visao Computacional do IPRJ: computacao grafica inversa, tecnologia do kinect, wii, PS3Eye, etc.
 - Curso de Teoria dos Padroes do IPRJ: aprendizagem de maquina, tecnicas estocasticas, vertente importante de Visao Computacional
 
Provas
- P1: terca-feira 3/Dez/2013 (pdf)
 - Pf/Sub:
 
Tarefas
Tarefa 1: intro ao blender - modelagem simples de um mascote do IPRJ
- Desenhar e modelar um mascote do IPRJ no blender usando apenas cubos e esferas simples
 - Data de entrega: 1/Out/2013
 
Tarefa 2: Girando Câmeras em Python
Objetivo: Simular uma camera girando em torno de um objeto, usando a API Python do Blender. A rotacao deve ser em torno de um eixo arbitrario. Sugiro os seguintes passos
- Realizar a rotacao de um objeto simples (cubo) em torno da origem no plano x-y, tomando o eixo z como eixo de rotacao. Aprenda como rotacoes estao representadas no Blender.
 - Realizar a rotacao de um objeto simples em torno de um centro e eixo arbitrario.
 - Realizar agora a rotacao de uma camera em torno do eixo z no plano x-y em torno da origem. Aprenda como cameras sao representadas no Blender. Elas usam a regra da mao direita? E o eixo z aponta para a cena ou contra a cena (z negativo)?
 - Realizar a rotacao de uma camera em torno de um eixo arbitrario. O usuario devera especificar o passo de rotacao em graus e o numero de passos no programa python, de preferencia em uma janela. Voce pode animar a camera ou entao simplesmente gerar varias copias da camera inicial.
 - Renderize uma animacao com uma camera girando em torno de um objeto. Mostre a matriz de rotacao.
 - Renderize a mesma animacao, agora com a camera fixa e o objeto girando no sentido contrario. Mostre a matriz de rotacao.
 
- Entrega do projeto:
- Programa com README explicando como foi feito e mostrando como ficou a geometria.
 - Apresentacao: ha duas alternativas, apresentar em aula para todos, ou enviar um video para o professor gravando a tela do seu computador:
- Apresentacao de 10min.
 - Se preferir, grave um video do programa funcionando em cada um dos passos acima. Utilize um programa para gravar a tela, no linux [5]. Dessa forma voce sera dispensado da apresentacao.
 
 
 - Data de entrega: 29/Outubro --> adiado 1 semana para 5/Novembro
 
Tarefa 3: Splines, Animacao, e Efeitos 3D
- Enunciado
 - Data de entrega: terca-feira 26/Nov/2013 ate a meia-noite. Atrasos serao aceitos, porem somente com reducao na nota.
 - Uma versao mais elaborada deste trabalho pode ser entregue opcionalmente como projeto final. Porem o basico de todos os itens devera ser entregue na data pois valera como nota de tarefa tambem.
 
Instrucao para Submissao
- Enviar um arquivo zipado com tudo (scripts, apresentacao, relatorio/readme, etc) por email, no formato:
 
<sobrenome>-<nome>-computacao-grafica-<ano>-tarefa<numero_tarefa>.zip
- Regra para apresentacao ou screencast similarmente `a tarefa anterior
 - Relatorio em pdf: Alem do README, explique o conteudo (como funciona, processo de desenvolvimento, teoria de cada efeito) em um relatorio. Divida as tarefas entre seus colegas do grupo!
 - Grupos de no max. 3 pessoas.
 
Ideias de efeitos
Renderizacao de linhas e NPR (non-photorealistic rendering) com freestyle
Renderizacao Distribuida
- No IPRJ temos um cluster disponivel aos alunos para renderizacao paralela em alta resolucao
- Disponivel aos alunos estao os seguintes recursos do cluster: 4 nós, cada um com dois processadores de 6 núcleos dual thread, dando 24 threads por nó - um total de 96 threads. Cada nó possui 16 GB de RAM e 4 placas de rede gigabit lan. Dois dos 4 nós possuem placa NVidia Tesla M2075 com 448 cores / 6GB RAM / 1 Tflops (precisão simples) ou 515 Gflops (precisão dupla), totalizando quase 1000 cuda cores com 12 GB RAM. A servidora de arquivos trabalha em redundância RAID 6 com 3 TBytes livres. Rodando no momento Opensuse 12.2.
 
 - Cada grupo de alunos elege um representante responsavel pela renderizacao, que seja usuario de Linux
 - Renderizacao distribuida bem-sucedida em full HD vai valer ate 1 ponto adicional na media do grupo
 
Projetos
- Ideia default: Gerar uma animacao de alguns minutos com alta qualidade.
- Interessante: explorar freestyle non-photorealistic rendering http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.67/FreeStyle
 
 - Ideia: Propor um projeto de sua preferencia
 - Ideia: Melhorar algum projeto de iniciacao cientifica
 - Ideia: interatividade com superficies no Scilab, aplicado a processamento de dados de corrosao do prof. Ivan, de amplo interesse de entidades como a petrobras.
 
Criterio de Avaliacao
- Trabalhos: 70% da media
 - Uma prova apenas
 - Sera dado maior peso aos trabalhos mais complexos
 - Bonus: top 2 projetos terao +3 pontos na media (caso atingirem um alto nivel)