Skip navigation

hoje focamos alguns exemplos de comportamentos de partículas mais avançados com o openframeworks. analisamos partículas em vectores c++, depois extendemos a class das partículas para incorporar forças de atracção e repulsão em função de elementos ou as outras partículas vizinhas, e vamos desembocar em exemplos de enxames. finalizamos com exemplos 3d e interacção imagem/som.

 

vectores c++

 

o primeiro passo é introduzir e saber manipular vector <tipo_de_dados> myVector; um vector é parecido com uma arraylist de java, como analisamos no processing, uma estrutura de dados que pode ser povoada dinamicamente a qualquer altura do código. declaram-se variáveis como tipo vector de um tipo de dados padrão ou por nós definido (entre <>).

 

para inserir elementos, criamos o elemento do tipo que queremos, e chamamos para o vector com a função myVector.push_back( elemento a adicionar ); a qualquer altura podemos saber o número de elementos no vector com myVector.size();, e eliminar elementos com a myVector.erase(), ou limpar todo o vector com myVector.clear();

 

na aplicação sp16_parts_vector inicializamos e gerimos as partículas com estes loops simples:

.. declarar

vector <Part> particulas;

 

.. durante a setup

// inicializar

int numparticulas = 250;

for(int i=0;i<numparticulas;i++){

Part particula;

particula.init(ofRandom(0,ofGetWidth()),ofRandom(0,ofGetHeight()));

particulas.push_back(particula);

}


.. durante a draw

for(int i=0; i<particulas.size();i++){

if(particulas[i].active )

particulas[i].render();

}

sp16-parts-vector

 

 

partículas

 

além da integração simples de novas posições a partir de velocidades, já vimos alguns exemplos onde aplicamos forças às partículas. o motor de movimento será quase sempre idêntico. o loop do sistema de partículas físico será algo como:

1. colocar as forças das partículas a zeros (acc = 0)

2. calcular novas forças para cada partícula ( acc = x )

3. adicionar a força calculada à velocidade ( vel += acc )

4. adicionar a velocidade calculada à posição ( pos += vel )

 

as inovações e coisas mais interessantes começam a surgir quando usamos diferentes formas de calcular forças a actuar nas partículas. primeiro vimos alguns exemplos onde há uma força de atracção global para todas as partículas em direcção ao rato, mas depois cada partícula recebe também uma força de repulsão em relação à posição das vizinhas, o que dá um novo tipo de organicidade ao sistema.

sp16-parts-frcs

 

outro exemplo é ter um campo de forças a actuar nas partículas, consoante a posição da partícula, vai receber um vector de direcção do campo de forças, que forçará padrões de movimento consoante as orientações dos campos de partículas.

 

sp16-vf1

 

enxames

 

os enxames vão ser um caso especial desenvolvido dos anteriores, onde cada partícula vai calcular três ou mais tipos de forças consoante a posição das partículas vizinhas. além da pos, vel, acc, vamos ter floats que pesam cada uma destas forças nas partículas. as forças nos enxames costumam ser: força de separação (pelo menos estar a distância x das outras partículas), força de coesão (força na direcção do centro de massa do enxame de distância y), força de alinhamento (força na direcção actual das restantes partículas a uma distância z).

 

o passo 2 que esboçamos anteriormente vai então desdobrar-se em pequenos sub-passos:

2.  calcular novas forças para cada partícula ( acc = x )

2.1 calcular vector de separação, coesão e alinhamento

2.2 pesar os vectores com os coeficientes das forças e somá-los para obter a acc

 

uma vez realizados estes passos temos as novas forças das partículas. os diferentes comportamentos autónomos que se podemo construir vão ter aqui o ponto-chave, que forças calcular para obter determinado tipo de comportamento em relação aos restantes elementos do enxame.

 

sp16-flocking

 

finalizamos com um exemplo que envolve som, bolas que interagem e colidem entre elas, quando tocam no chão despoletam a reprodução de um fragmento sonoro na posição temporal dependendo do x de cada bola, e de vol e duração dependendo das velocidades de impacto no chão.

 

sp16-2001

sp16-2001a

 

Anúncios

3 Comments

  1. algumas notas sobre a criação dos projectos em windows com o codeblocks, tem sido dificil configurar os ficheiros, nada fácil como com o x-code, espero que sirvam:

    – thread do forum of com info http://www.openframeworks.cc/forum/viewtopic.php?p=9914

    edit: dupliquem o projecto allAddonsExample.cbp (em apps\addonsExamples\allAddonsExample ), já tem todos os addons configurados, e em principio não será necessário fazer os passos listados abaixo cujo objectivo é incluir as directorias dos addons na path do vosso projecto.

    – basicamente duplica-se um projecto já existente.os projectos podem-se abrir com um editor de texto, infelizmente é mais fácil configurá-los aí.

    – os projectos que usam addons ou outras libs têm mais directorias especificadas na opção compiler do .cbp notem as directorias para incluir os addons.

    <Compiler>
    <Add option=”-Wno-multichar” />
    <Add directory=”../../../libs/glu” />
    <Add directory=”../../../libs/freeType/include” />
    <Add directory=”../../../libs/freeType/include/freetype2″ />
    <Add directory=”../../../libs/freeImage” />
    <Add directory=”../../../libs/quicktime/CIncludes” />
    <Add directory=”../../../libs/rtAudio” />
    <Add directory=”../../../libs/fmodex/inc” />
    <Add directory=”../../../libs/videoInput/include” />
    <Add directory=”../../../libs/glee/include” />
    <Add directory=”../../../libs/glut” />
    <Add directory=”../../../libs/openFrameworks” />
    <Add directory=”../../../libs/openFrameworks/app” />
    <Add directory=”../../../libs/openFrameworks/events” />
    <Add directory=”../../../libs/openFrameworks/graphics” />
    <Add directory=”../../../libs/openFrameworks/utils” />
    <Add directory=”../../../libs/openFrameworks/sound” />
    <Add directory=”../../../libs/openFrameworks/video” />
    <Add directory=”../../../libs/openFrameworks/communication” />
    <Add directory=”../../../addons” />
    <Add directory=”../../../addons/ofxObjLoader/src” />
    <Add directory=”../../../addons/ofxDirList/src” />
    <Add directory=”../../../addons/ofxNetwork/src” />
    <Add directory=”../../../addons/ofxOpenCv” />
    <Add directory=”../../../addons/ofxOpenCv/src” />
    <Add directory=”../../../addons/ofxOpenCv/libs/opencv/include” />
    <Add directory=”../../../addons/ofxOsc/libs/oscpack/include/ip” />
    <Add directory=”../../../addons/ofxOsc/libs/oscpack/include/osc” />
    <Add directory=”../../../addons/ofxOsc/src” />
    <Add directory=”../../../addons/ofxThread/src” />
    <Add directory=”../../../addons/ofxVectorMath/src” />
    <Add directory=”../../../addons/ofxXmlSettings/src” />
    <Add directory=”../../../addons/ofxXmlSettings/libs” />
    <Add directory=”../../../addons/ofxVectorGraphics/src” />
    <Add directory=”../../../addons/ofxVectorGraphics/libs” />
    <Add directory=”../../../libs/poco/includes” />
    <Add directory=”../../../addons/ofx3DModelLoader/src” />
    <Add directory=”../../../addons/ofx3DModelLoader/src/3DS” />
    </Compiler>

    – depois apenas falta seleccionar o projecto acabado de configurar, com o botão do lado direito seleccionar …add files, e adicionar o restante source code do projecto, e mandar compilar e correr, em principio já está tudo

    • Para usar os addons do OF em vez do eventsExample.cbp usem o allTestExample.cbp que está em apps\addonsExamples\allAddonsExample.

      O código a modificar na file .cbp será:” este código:
      ————————————————————————————————————————-

      <Compiler>
                  <Add option=”-Wno-multichar” />
                  <Add directory=”../../../libs/glu” />
                  <Add directory=”../../../libs/freeType/include” />
                  <Add directory=”../../../libs/freeType/include/freetype2″ />
                  <Add directory=”../../../libs/freeImage” />
                  <Add directory=”../../../libs/quicktime/CIncludes” />
                  <Add directory=”../../../libs/rtAudio” />
                  <Add directory=”../../../libs/fmodex/inc” />
                  <Add directory=”../../../libs/videoInput/include” />
                  <Add directory=”../../../libs/glee/include” />
                  <Add directory=”../../../libs/glut” />
                  <Add directory=”../../../libs/openFrameworks” />
                  <Add directory=”../../../libs/openFrameworks/app” />
                  <Add directory=”../../../libs/openFrameworks/events” />
                  <Add directory=”../../../libs/openFrameworks/graphics” />
                  <Add directory=”../../../libs/openFrameworks/utils” />
                  <Add directory=”../../../libs/openFrameworks/sound” />
                  <Add directory=”../../../libs/openFrameworks/video” />
                  <Add directory=”../../../libs/openFrameworks/communication” />
                  <Add directory=”../../../addons” />
                  <Add directory=”../../../addons/ofxObjLoader/src” />
                  <Add directory=”../../../addons/ofxDirList/src” />
                  <Add directory=”../../../addons/ofxNetwork/src” />
                  <Add directory=”../../../addons/ofxOpenCv” />
                  <Add directory=”../../../addons/ofxOpenCv/src” />
                  <Add directory=”../../../addons/ofxOpenCv/libs/opencv/include” />
                  <Add directory=”../../../addons/ofxOsc/libs/oscpack/include/ip” />
                  <Add directory=”../../../addons/ofxOsc/libs/oscpack/include/osc” />
                  <Add directory=”../../../addons/ofxOsc/src” />
                  <Add directory=”../../../addons/ofxThread/src” />
                  <Add directory=”../../../addons/ofxVectorMath/src” />
                  <Add directory=”../../../addons/ofxXmlSettings/src” />
                  <Add directory=”../../../addons/ofxXmlSettings/libs” />
                  <Add directory=”../../../addons/ofxVectorGraphics/src” />
                  <Add directory=”../../../addons/ofxVectorGraphics/libs” />
                  <Add directory=”../../../libs/poco/includes” />
                  <Add directory=”../../../addons/ofx3DModelLoader/src” />
                  <Add directory=”../../../addons/ofx3DModelLoader/src/3DS” />
              </Compiler>

      Depois é só faser add files no IDE do CB e acrescentar tudo o que está dentro do src para o projecto, podem mudar depois uma a uma as files das pastas que criaram para dentro da respectiva pasta src, para manter tudo organisado (é um bocado estúpido, devia ser tudo drag and drop!).Podem também mudar o nome do projecto em properties e fazer save project as com novo nome para a file .cbp ter outro nome (ou mudar o nome da propria file e só depois abrir no CB).

      Quanto a outras bibliotecas acho que é só por as directorias das libs no espaço da file .cbp e depois acrescenta-las no IDE do code::blocks?

  2. Só quero sublinhar o recurso do allAddonsExample, fiz várias experiências com outros e tive sempre problemas, com este ainda não tive nenhum. Pena foi ter estado distraído aos comentários e ter perdido tanto tempo.


3 Trackbacks/Pingbacks

  1. By sessão 16 @ Aaron Buerge Blog on 07 Maio 2009 at 6:35 pm

    […] sessão 16 Posted on May 7, 2009 by blogger. Categories: Uncategorized. … parecido com uma arraylist de java, como analisamos no processing, uma estrutura de dados que pode ser povoada dinamicamente a qualquer altura do cód igo….more on this… […]

  2. By » sessão 16 dracula Blog on 07 Maio 2009 at 6:44 pm

    […] sessão 16 … parecido com uma arraylist de java, como analisamos no processing, uma estrutura de dados que pode ser povoada dinamicamente a qualquer altura do cód igo….more on this… […]

  3. By sessão 18 « O Som do Pensamento on 27 Maio 2009 at 11:42 am

    […] por fim analisamos vários projectos construídos em c++ com o ambiente de programação openframeworks. analisamos a estrutura e funcionamento do compilador, linker, geração de código executável, e expandimos alguns exemplos de processing em c++. primeiro analisamos a programação por objectos, recorrendo a classes que têm variáveis e funções membros, e construímos vários exemplos em c++ que usam partículas, reconhecimento de imagem, som, comunicação por rede, interacções com sons e rato e electrónicas. (sessões 15, 16) […]

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

%d bloggers like this: