ANIMAÇÕES DE MODELOS 3D NO FLIGHTGEAR
As animações no Flightgear tem a finalidade de exibir, durante a simulação, algum movimento para algum objeto do modelo 3D da aeronave. Utilizando as animações, podemos criar movimentos ordenados e coordenados, iniciados por uma ou mais propriedades. Por exemplo, se o trem de pouso estiver definido como 'baixado', então mostrar as rodas em uma posição, senão mostrar em outra posição. Ainda outro exemplo, se o motor estiver ligado, então girar o fan, senão deixar essa parte parada. Todos movimentos vistos em um modelo 3d com o simulador em execução, é fruto de alguma animação definida pelo criador da aeronave.
Tipos de Animações
Rotate
A animação rotate possibilita que um objeto 3d seja rotacionado em torno de um eixo fixo, ou centro com aparece no código XML. Vejamos o exemplo a seguir do trem de pouso dianteiro do Boeing 707:
<animation> <type>rotate</type> <object-name>nosegear</object-name> <property>gear/gear[0]/position-norm</property> <interpolation> <entry> <ind>0.0</ind> <dep>115.0</dep> </entry> <entry> <ind>0.25</ind> <dep>115.0</dep> </entry> <entry> <ind>0.75</ind> <dep>0.0</dep> </entry> <entry> <ind>1.0</ind> <dep>0.0</dep> </entry> </interpolation> <center> <x-m>-15.46</x-m> <y-m>0</y-m> <z-m>-1.40</z-m> </center> <axis> <x>0</x> <y>1</y> <z>0</z> </axis> </animation>
Vou considerar que o leitor sabe como funciona um XML e como é estruturado, a sua idéia de elementos. Vejamos o que cada uma das linhas acima definem
<animation> - define que estamos declarando uma animação, lembre-se de encerrar cada elemento do XML, no caso do <animation>, com o código </animation>.
<type>rotate</type> - estabelece que o tipo de movimentação será 'rotate', rotação em torno de um eixo.
<object-name>nosegear</object-name> - é o nome do objeto que será movimentado. Para descobrir o nome de um objeto do modelo 3d, ou seja, de uma parte do avião, abra o modelo 3d no AC3D, selecione o objeto desejado com o seletor de objetos e então verifique seu nome no canto inferior esquerdo da tela.
<property>gear/gear[0]/position-norm</property> - aqui é definida a propriedade que comandará a animação, neste caso, o tem de pouso '0' (zero). Essa propriedade assume valores 0 e 1.
<interpolation> <entry> <ind>0.0</ind> <dep>115.0</dep> </entry> <entry> <ind>0.25</ind> <dep>115.0</dep> </entry> <entry> <ind>0.75</ind> <dep>0.0</dep> </entry> <entry> <ind>1.0</ind> <dep>0.0</dep> </entry> </interpolation>
O elemento <interpolation> é uma tabela de interpolação, onde cada <entry> é uma linha dessa tabela. Antes de falar mais sobre isso, vou explicar o funcionamento de uma animação. A animação é coordenada pelo valor de uma propriedade. Se a propriedade é zero, mostra uma coisa, se a propriedade é 1, mostra outra coisa para o usuário do simulador. Exemplo, se trem de pouso baixado (ou seja gear/gear[0]/position-norm = 1), mostra as rodas. Se trem de pouso recolhido (ou seja gear/gear[0]/position-norm = 1), não mostra as rodas. Compreendido? Ok, mas ninguémm acha interessante que as rodas apareçam e desapareçam num passe de mágica. 1 então aparece, 0 então desaparece. Isso seria pouco realístico e pareceria grosseiro um avião assim. Então é necessário criar um movimento contínuo. Essa é a tarefa da tabela de interpolação. Definidos alguns pontos, o movimento será suavizado, ou seja, o objeto do modelo 3d se deslocará de 0 a 1 suavemente, durante algum tempo. O que resulta em uma bela animação de baixar ou recolher o trem de pouso. Vejamos então cada entrada dessa tabela:
<entry> <ind>0.0</ind> <dep>115.0</dep> </entry>
Informa que, quando a propriedade for 0.0 (zero), então o objeto do modelo 3d sofrerá uma rotação de 115° (cento e quinze graus).
<entry> <ind>0.25</ind> <dep>115.0</dep> </entry>
Informa que, quando a propriedade for 0.25, então o objeto do modelo 3d sofrerá uma rotação de 115°.
<entry> <ind>0.75</ind> <dep>0.0</dep> </entry>
Informa que, quando a propriedade for 0.75, então o objeto do modelo 3d sofrerá uma rotação de 0.0°, ou seja, estará na posição natural dele. Onde posição natural é aquela em que encontramos o objeto do modelo 3d normalmente no AC3D.
<entry> <ind>1.0</ind> <dep>0.0</dep> </entry>
Informa que, quando a propriedade for 1.0 (um), então o objeto do modelo 3d sofrerá uma rotação de 0.0°.
Em suma, o valor da propriedade, ou índice como é chamado, vai variando de 0 até chegar em 1 ao longo de um determinado tempo. A animação então fica ritmada, coordenada, por esse índice.
<center> <x-m>-15.46</x-m> <y-m>0</y-m> <z-m>-1.40</z-m> </center>
O elementro <center> especifica o centro da rotação, onde devemos especificar os valores de X, Y e Z deste centro de rotação. A posição de um ponto que funciona como centro pode ser obtida com o AC3D. Abra o AC3D, selecione um ponto que funcionará como centro para a rotação e olhe as coordenadas desse ponto na parte superior da tela. Outra maneira de capturar o valor <x,y,z> de um ponto é usar o plugin para o AC3D "Vertex positions to clipboard". Esse plugin simplifica muito a tarefa de descobrir coordenadas no espaço.
Sendo mais claro sobre o que é um centro de rotação, pense em um fan de um turbofan (turbina), ele gira em torno de seu eixo central. Então o centro de rotação do fan é o seu eixo central. Se desejarmos animar um fan, devemos saber as coordenadas do eixo central do fan. Esse foi apenas um exemplo para compreender o que é um centro de rotação, pois o tipo de rotação mais adequado para animar um fan não é o 'rotate', mas sim o 'spin'.
<axis> <x>0</x> <y>1</y> <z>0</z> </axis>
O elemento axis determina em torno de que eixo (x, y ou z) o objeto do modelo 3d sofrerá a rotação. Se o elemento <x> de <axis> receber o valor 1, então a rotação se dará em torno do eixo x. Ao passo que se o elemento <y> de <axis> receber o valor 1, então a rotação se dará em torno do eixo y. Quando o elemento de um eixo recebe valor zero, então não há rotação em torno deste eixo.
Resumindo, então o objeto é movimentado em torno de um eixo e tendo como referencia um ponto chamado de centro. Por exemplo, um carrossel de crianças sofre uma rotação no eixo 'z' tendo como referência o seu meio. Experimente a mudança de valores e teste no simulador. O processo de tentativa e erro também nos leva a adquirir aconhecimento de como as coisas funcionam e desenvolvem a habilidade de animar peças e pensar em coordenadas <x,y,z>
Spin
A animação de tipo spin possibilita uma rotação contínua e coordenada de um objeto do modelo 3d. Esse tipo de animação geralmente é utilizado em hélices e fans de turbofans. Veja o exemplo abaixo, é uma animação para o fan do primeiro reator P&W JT3D de um 707-300
<animation> <type>spin</type> <object-name>fandisk</object-name> <property>engines/engine[0]/n1</property> <factor>10</factor> <center> <x-m> 1.87</x-m> <y-m>-14.81</y-m> <z-m>-0.18</z-m> </center> <axis> <x>1</x> <y>0</y> <z>0</z> </axis> </animation>
Pode-se notar que muitos elementos são comuns com o tipo de animação abordado anteriormente. Veja abaixo a descrição dos itens desse tipo de animação.
<animation> - define que estamos declarando uma animação, lembre-se de encerrar cada elemento do XML, no caso do <animation>, com o código </animation>.
<type>spin</type> - estabelece que o tipo de movimentação será 'spin', rotação em torno de um ponto central. Diferentemente da animação de tipo 'rotate', a animação de tipo 'spin' é contínua, ou seja, o objeto será rotacionado 360° indefinidamente segundo a propriedade que o comanda.
<object-name>fandisk</object-name> - é o nome do objeto que será movimentado. Para descobrir o nome de um objeto do modelo 3d, ou seja, de uma parte do avião, abra o modelo 3d no AC3D, selecione o objeto desejado com o seletor de objetos e então verifique seu nome no canto inferior esquerdo da tela. Neste exemplo, fandisk é o nome do objeto 3d do fan do primeiro reator P&W JT3D de um 707-300.
<property>engines/engine[0]/n1</property> - aqui é definida a propriedade que comandará a animação, neste caso, a utilização do dispositivo n1 de um turbofan, que geralmente varia entre 0% e 100%.
<factor>10</factor> - O <factor> funciona como um fator multiplicativo para a relação entre a propriedade comandante o movimento executado pelo objeto 3d comandado. A propriedade 'controls/rudder' varia entre 0 e 1 e eu quero que o objeto Rudder do avião (modelo 3d) se movimente 18°, então devo usar um fator 18. Ou seja, 18 * 0 = 0 e 18 * 1 = 18, portanto o objeto Rudder se movimentará entre 0 e 18.
Translate
Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
REFERÊNCIAS
- http://wiki.flightgear.org/index.php/Howto:_3D_Aircraft_Models FlightGear Wiki - Animações