1. Introdução 2. Ficheiro de descrição das cenas
Transcrição
1. Introdução 2. Ficheiro de descrição das cenas
Programação 2008/2009 MEEC - MEAer Projecto de Programação - moviemaker 1. Introdução A produção de animações recorrendo a sistemas informáticos viu um grande desenvolvimento nos últimos anos. Nestes filmes, são usadas linguagens de descrição das cenas, que descrevem cada fotograma, para o qual é gerada uma imagem. Após a geração de todos os fotogramas (são necessários 30 fotogramas para cada segundo de filme) estes são agrupados num ficheiros de texto. No projecto a realizar pelos alunos, será desenvolvido um programa, chamado moviemaker, que a partir de um ficheiro com a descrição de uma cena (objectos e a sua movimentação) produz vários fotogramas. O programa a realizar pelos alunos deverá ler um ficheiro com a descrição de uma cena. Nesta descrição está incluída a criação de objectos (pontos, linhas e outras figuras geométricas) numa determinada posição, a manipulação desses objectos (deslocamentos, redução/ampliação e destruição) assim como a geração do fotograma (fotografia dos estado dos objectos num determinado momento). 2. Ficheiro de descrição das cenas O ficheiro com a descrição das cenas é composto por comandos ordenados que serão interpretados e executados sequencialmente. Estes comando podem ser de: • Criação de objectos • Manipulação de objectos • Destruição e objectos • Geração de fotograma Comando_criacao Translacao_objecto Rotacao_objecto_cg Rotacao_objecto_pt Redimens_objecto Geracao_fotograma Eliminacao_objecto \n Entre cada comando pode aparecer uma ou mais linhas em branco. 2.1. Criação de objectos Para realizar a criação de objectos deverá aparecer no ficheiro a seguinte informação: • Nome • Número de vértices • Cor • Coordenadas dos diversos vértices. A estrutura do comando de criação de um objecto é a seguinte: N \n Nome N_vértices vértices cor \n \n Na primeira linha aparece o caracter N e na segunda aparece um nome, seguido do número de vértices e de uma cor. Nas linhas seguintes aparecem as coordenadas dos vários vértices. Se o número de vértices for 0 (zero), não será criado nenhum objecto. Após a leitura da informação este objecto deve ser armazenado em memória, podendo ser manipulado pelos comandos de manipulação. Aparece em todos os fotogramas até que seja destruído. Nome O nome de uma figura é uma sequência de caracteres sem espaços ou tabs. Podem existir vários objectos com o mesmo nome. N_vertices O número de vértices (N_vertices) é um número inteiro, maior que zero. Se aparecer um número de vértices menor ou igual a zero não deverá ser criado esse objecto, continuando a leitura do ficheiro. Os vértices lidos corresponderão aos extremos dos segmentos de recta que compõem o objecto: para criar um quadrado serão necessários 5 vértices! Cor Na criação do objecto a cor com que ele será desenhado pode ser um inteiro, positivo ou negativo. Se for positivo só são desenhadas as linhas que ligam os vértices consecutivos, se a cor for negativa o objecto é também preenchido. Os valores a usar na definição dos objectos serão os seguintes: Vértices Para cada vértice deverão ser definidas as suas coordenadas, dois números inteiros separados por um espaço. O primeiro valor corresponde à coordenada X, o seguinte à coordenada Y. Exemplos N A1 4 4 50 50 50 100 100 100 100 50 N Q1 5 4 50 50 50 100 100 100 100 50 50 50 N Q2 5 -4 50 50 50 100 100 100 100 50 50 50 2.2. Manipulação de objectos Existem diversos tipos possíveis de manipulação dos objectos previamente criados: • Translação • Rotação sobre centro geométrico • Rotação sobre um ponto • Redimensionamento Para cada tipo de manipulação é usado um identificador (T, R, C, S) que aparece separado numa linha e precede os seus parâmetros. Um destes parâmetros é o nome do objecto sobre o qual aplicar a manipulação. A manipulação deverá será aplicada a todos os objectos cujo nome é igual ao parâmetro. Se o utilizador usar o valor all, a transformação será aplicada a todos os objectos existentes. As alterações descritas com este comando são cumulativas, a segunda operação vai manipular o objecto na nova posição e não na original. 2.3. Translação Esta operação (T) permite movimentar linearmente um ou vários objectos. O primeiro parâmetro é o nome do ou dos objectos a deslocarem-se. Os outros dois parâmetros correspondem à distância deslocada em cada um dos eixos: Delta_x É um inteiro positivo ou negativo que corresponde à distancia que o objecto se deve deslocar sobre o eixo X. Se for positivo o objecto desloca-se para a direita, se for negativo desloca-se para a esquerda Delta_y É um inteiro positivo ou negativo que corresponde à distancia que o objecto se deve deslocar sobre o eixo Y. Se for positivo o objecto desloca-se para cima, se for negativo desloca-se para baixo. Exemplo Antes Comando Depois T A1 50 25 2.4. Rotação sobre centro geométrico Esta operação permite a rotação de um objecto sobre o seu centro geométrico, calculado apenas com os vértices. O primeiro parâmetro é o nome do ou dos objectos a serem rodados, o segundo é o angulo de rotação em graus. R \n Nome Angulo \n Ângulo É um valor numérico positivo ou negativo que corresponde ao angulo de rotação do objecto. Se for positivo o objecto roda no sentido dos ponteiros dos relógios, se for negativo roda no sentido contrário. Exemplo Antes Comando Depois R A1 90 Antes Comando Depois R A1 -45 2.5. Rotação sobre um ponto Esta operação permite a rotação de um objecto em que o centro da rotação é um ponto especificado como parâmetro. O primeiro parâmetro é o nome do ou dos objectos a serem rodados, os seguintes são as coordenadas do centro de rotação (X e Y) e o último é o angulo de rotação em graus. Centro O centro da rotação é composto por dois valores numéricos (centro_x e centro_y) que representam as suas coordenadas. A rotação do objecto será realizada sobre este ponto. Ângulo É um valor numérico positivo ou negativo que corresponde ao angulo de rotação do objecto. Se for positivo o objecto roda no sentido dos ponteiros dos relógios, se for negativo roda no sentido contrário. Exemplos Antes Comando Depois C A1 25 0 -45 Antes Comando Depois C Q1 100 50 45 2.6. Redimensionamento Esta operação permite o redimensionamento (ampliação ou redução) de um ou vários objectos. Este redimensionamento será realizado garantindo-se que o centro geométrico do objecto se mantêm inalterado. O primeiro parâmetros é o nome do ou dos objectos a serem manipulados e o segundo valor é o factor de ampliação/redução. S \n Nome Escala \n Escala Este valor numérico deve ser maior ou igual a zero. Se for inferior a 1 corresponde a uma redução, se for maior que um será feita uma ampliação do objecto. Por exemplo, aplicando um factor de escala de 0.5, obter-se-á um objecto com metade da largura e da altura originais. Se for aplicado um factor de escala de 3 a um objecto, este ficará com a largura e altura triplas das originais. Exemplos Antes Comando Depois S A1 2 S A1 0.5 Antes Comando Depois S Q2 3 2.7. Destruição de objectos Este comando permite a eliminação de um ou mais objectos. Recebe como parâmetro um nome. Nome Se existirem vários objectos com nome semelhante ao parâmetro deste comando, todos esses objectos são eliminados, não aparecendo nos fotogramas posteriores. Se aparecer a palavra all, todos os objectos são eliminados. 2.8. Geração de Fotograma Este comando não tem parâmetros. Quando ocorre é gerado uma imagem com a “fotografia” do estado de todos os objectos. São desenhados os objectos na sua posição corrente. 2.9. Exemplo Apresenta-se de seguida uma série de comandos assim como as imagens geradas, estes comandos estariam num único ficheiro de texto, que seria processado e dos quais seriam geradas sequencialmente as imagens apresentadas à direita. O ficheiros com estes comando, assim como as imagens geradas podem ser obtidas no site da cadeira. Comandos N A1 4 4 50 50 50 100 100 100 100 50 Imagem gerada Comandos S A1 0.5 P P T A1 50 25 C A1 25 0 -45 P P R A1 90 E A1 P P R A1 -45 N Q2 5 -4 50 50 50 100 100 100 100 50 50 50 P P S A1 2 S Q2 3 P P Imagem gerada Comandos Imagem gerada E Q2 P N Q1 5 4 50 50 50 100 100 100 100 50 50 50 Comandos Imagem gerada C Q1 100 50 45 P C Q1 100 50 45 P P C Q1 100 50 45 P C Q1 100 50 45 P C Q1 100 50 45 P C Q1 100 50 45 P C Q1 100 50 45 P 3. Ficheiros de saída Sempre que, no ficheiro de descrição de cenas, aparece o comando P, é gerada uma imagem numerada sequencialmente. A imagem gerada é do formato png com as dimensões de 640×480. O primeiro fotograma gerado deve-se chamar movie00000000.png, o segundo movie00000001.png e assim sucessivamente. Neste ficheiro são desenhados os objecto existentes na cena nas suas posições absolutas: um objecto cujas coordenadas sejam negativas ou superiores às dimensões da imagem não aparecerá. 4. Execução Quando invocado sem parâmetros o programa de geração de filmes lê um ficheiro com a descrição da cena chamado scene.scn. Cada fotograma a gerar terá as dimensões de 640x480 (640 colunas por 480 linhas) e é armazenado em ficheiro com o formato png. O nomes dos ficheiros dos fotogramas é composto por um prefixo (movie), seguido do número do fotograma (00000000, 00000001, ..., 00000099, ...) seguido da extensão (.png). 4.1. Argumentos da linha de comando Usando os argumentos da linha de comando deverá ser possível: • Usar ficheiro com descrição de cenas com nomes distintos de scene.scn • Gerar fotogramas com prefixo diferente de movie • Gerar fotogramas com dimensões distintas de 640x480 Qualquer combinação dos argumentos aqui apresentados é possível. -f nome_ficheiro Usando o argumento –f será possível ler cenas de ficheiros com nomes distintos de scene.scn . O nome do ficheiros com a descrição da cena deverá aparecer após o argumento –f e separados por um espaço. Por exemplo, para se ler a descrição de uma cena a partir de um ficheiro chamado cena2.txt deverá ser dado o comando moviemaker –f cena2.txt. -m prefixo_fotograma O argumento –m permite a geração de fotogramas com nomes diferentes do valor predefinido (movie00000000.png, ...). O nome que ocorre após –m é o prefixo que será usado na construção do nome dos diversos fotogramas. Se invocarmos moviemaker –m cena2, serão gerados diversos ficheiros cujos nomes começam por cena2: cena200000000.png, cena200000001.png, cena200000002.png, ... -x dim_x A largura predefinida para os fotogramas é de 640 colunas. Se se desejar criar fotogramas com larguras diferentes, deve-se usar o parâmetros –x seguido do novo valor da largura (inteiro positivo). Este argumento não altera a altura das imagens geradas. Usando os parâmetros –x 1024 os fotogramas gerados terão 1024 colunas de largura. -y dim_y A altura predefinida para os fotogramas é de 480 linhas. Se se desejar criar fotogramas com alturas diferentes, deve-se usar o parâmetros –y seguido do novo valor da altura (inteiro positivo). Este argumento não altera a largura das imagens geradas. Usando os parâmetros –x 768 os fotogramas gerados terão 768 linhas de altura. 4.2. Exemplo O comando moviemake –f filme1.txt –m filme –x 800 –y 600 teria o seguinte comportamento: • O ficheiro lido com a descrição da cena chamar-se-ia filme1.txt • Os fotogramas terão a seguinte dimensão: 800x600 • O nome dos ficheiros dos fotogramas terão o seguinte formato: filme00000000.png, filme00000001.png, filme00000002.png, ... 5. Geração de Fotogramas Para a geração de fotogramas deverá ser utilizada a biblioteca G2: • http://g2.sourceforge.net/g2_ref/ Esta biblioteca contêm uma série de funções para geração de imagens em diversos formatos: inclui os mecanismos para criação dos ficheiros, assim como funções para escrita de figuras gráficas (pontos, polilinhas e polígonos). 6. Documentação O código produzido pelos alunos deverá ser comentado. Os comentários presentes no código deverão explicitar e explicar o funcionamento da aplicação assim como as decisões tomadas. Deve também ser usada a norma seguida pela aplicação Doxygen, necessária à geração da documentação relativa às funções implementadas: 7. Desenvolvimento do projecto Sugere-se um desenvolvimento faseado do projecto, garantindo os alunos que todas as funcionalidade codificadas até esse momento se encontram a funcionar correctamente. É preferível um programa que implementa poucas funcionalidade, mas funcionam correctamente, do que um programa cujos alunos tentaram desenvolver completamente mas que não faz nada. Assim sugerem-se os seguintes passos, pela ordem apresentada, para realização do projecto: • Leitura do ficheiro com a descrição das cenas • Criação de 1 objecto • Geração de 1 fotogramas com 1 objecto • Geração de vários fotogramas com 1 objecto • Manipulação de 1 objecto o Translação o Rotação sobre um ponto o Rotação sobre centro geométrico o Ampliação/Redução • Armazenamento de vários objectos • Geração de fotogramas com vário objectos • Manipulação de vários objecto o Translação o Rotação sobre um ponto o Rotação sobre centro geométrico o Ampliação/Redução • Destruição de Objectos • Argumentos da linha de comando A implementação de algumas operações sobre um único objecto podem ser adiadas para o momento em que o armazenamento de vários objectos se encontra a funcionar. 8. Avaliação A avaliação do projecto terá em conta diversos parâmetros: • • • • • • • Qualidade do código produzido Estruturação da aplicação Estruturas de dados usados no armazenamento dos objectos Comentários e documentação Tratamento de erros Funcionalidades implementadas Discussão oral 8.1. Entrega intermédia Será realizada uma entrega intermédia de código com a seguinte funcionalidade: • Leitura do ficheiro chamado scene.scn • Identificação de possíveis erros, com escrita no écran de mensagens explicativas • Contabilização do número de objectos correctamente criados • Contabilização discriminada (translação, rotação sobre centro geométrico, rotação sobre ponto, ampliação/redução) do número de operações correctamente declaradas no ficheiros • Contabilização do numero de destruições declaradas • Contabilização do número total de fotogramas a gerar. Este programa servirá de base para o desenvolvimento do projecto final. A entrega será realizada de modo electrónico, sendo dado conhecimento nas semanas posteriores da nota e dos problemas encontrados. Esta entrega intermédia será cotada entre 0 e 3 valores, sendo avaliado o seguinte: • Funcionalidade implementada e a funcionar • Estruturação do código • Comentários 8.2. Entrega Final Aquando da entrega final do projecto, os alunos deverão ter um programa que implemente todas as funcionalidades pedidas. Os alunos deverão entregar em versão electrónica (CD) a directoria do projecto KDevelop, uma cópia em papel das listagens do código e uma impressão da documentação gerada pelo Doxygen. O trabalho final e a discussão desse trabalho será cotada entre 0 e 17 valores.