Como Fazer um Sistema de Partículas?

2007 Setembro 11
by Naryu Yue

************************************ Tutorial Básico ****************************************

O que são Sistemas de Partículas?
Sistemas de partículas são como luzinhas, que podem ser programadas para comportarem-se de uma infinidade de maneiras. Pode-se criar com sistemas de partículas: chuva, fogo, água de uma fonte, sabres de luz, raios de luz, fogos de artifício e muito mais. Um bom lugar para visitar e ver muitos bons exemplos de Sistemas de Partículas é o Particle Labs. O lugar todo é um laboratório de partículas mesmo, aonde você pode ir clicando e mudando configurações em sistemas de particulas e observas o que aocntece de diferente. Para quem fala inglês, é um tutorial passo a passo, desde o Báscio até o Avançado.

Com um único comando de LSL, você pode fazer tudo isso! É sobre esse comando que vamos aprender no tutorial de hoje!

Como fazer um Sistema de Partículas?
O comando em si é bem simples:

llParticleSystem(list params);

O problema está em oque exatamente por nos params! hehe… Então vou tentar explicar parte por parte…

Parâmetros em Pares: use estes declarando o parâmetro e em seguida o seu valor:
PSYS_PART_START_ALPHA --> (float) transparência inicial da partícula
PSYS_PART_END_ALPHA --> (float) transparência final da partícula
(variam de 0.0 a 1.0: 0.0 é totalmente transparente, enquanto que 1.0 é totalmente opaco)
PSYS_PART_START_COLOR --> (vector) cor inicial da partícula em RGB
PSYS_PART_END_COLOR --> (vector) cor final da partícula em RGB
PSYS_PART_START_SCALE --> (vector) tamanho inicial da partícula nas 3 coordenadas
PSYS_PART_END_SCALE --> (vector) tamanho final da partícula nas 3 coordenadas
PSYS_PART_MAX_AGE --> (float) tempo máximo de duração da partícula em segundos, até 30 segundos
PSYS_SRC_MAX_AGE --> (float) tempo máximo de duração do sistema em segundos, 0 é infinito
PSYS_SRC_ACCEL --> (vector) aceleração da partícula
PSYS_SRC_ANGLE_BEGIN --> (float) ângulo inicial em radianos onde não haverá partículas
PSYS_SRC_ANGLE_END --> (float) ângulo final em radianos onde não haverá partículas
(estes dois acima são para uso em sistemas angulares (
PATTERN_ANGLE) )
PSYS_SRC_BURST_PART_COUNT --> (integer) número de partículas por emissão
PSYS_SRC_BURST_RADIUS --> (float) distância do centro do emissor onde as partículas são criadas em metros
PSYS_SRC_BURST_RATE --> (float) intervalo entre cada emissão em segundos
PSYS_SRC_BURST_SPEED_MIN --> (float) velocidade mínima de cada partícula
PSYS_SRC_BURST_SPEED_MAX --> (float) velocidade máxima de cada partícula
PSYS_SRC_OMEGA --> (float) velocidade angular de cada partícula
PSYS_SRC_TARGET_KEY --> (key) objeto ou avatar que será atingido pelas partículas
PSYS_SRC_TEXTURE --> (string) textura aplicada a todas as partículas. aparece como objeto 2D
PSYS_SRC_PATTERN --> (integer) tipo de comportamento das partículas

PSYS_PART_FLAGS --> é aqui que agente liga ou desliga tudo o que quiser... o valor desse campo pode ser combinado com operadores OR (|).

Flags:
PSYS_PART_BOUNCE_MASK --> as partículas "quicam" no z=0 do emissor
PSYS_PART_EMISSIVE_MASK --> as partículas ficam iluminadas
PSYS_PART_FOLLOW_SRC_MASK --> as partículas permanecem junto ao emissor
PSYS_PART_FOLLOW_VELOCITY_MASK --> gira as partículas acompanhando a direção da velocidade
PSYS_PART_INTERP_COLOR_MASK --> habilita a variação de cores
PSYS_PART_INTERP_SCALE_MASK --> habilita a variação de tamanho
PSYS_PART_TARGET_POS_MASK --> faz as partículas seguirem o alvo
PSYS_PART_WIND_MASK --> as partículas serão afetadas pelo vento

Patterns possíveis:
PSYS_SRC_PATTERN_ANGLE --> atira as partículas na área definida por PSYS_SRC_ANGLE_END. uma área sem partículas é definida por PSYS_SRC_ANGLE_BEGIN (2D)
PSYS_SRC_PATTERN_ANGLE_CONE --> o mesmo que acima, mas com efeito (3D)
PSYS_SRC_PATTERN_DROP --> as partículas "caem"
PSYS_SRC_PATTERN_EXPLODE --> as partículas "explodem"

Assim fica meio jogado… o melhor mesmo é ver exemplos… Tente colocar o script abaixo em algum objecto in-world. Tem dois “presets” já definidos, o Sparkly() e o Snowy(). Basta alternar entre eles e verificar como se comportam. Para ligar/desligar as partículas, use Touch.

//teste de partículas by Naryu Yue
//selecione dentre dois tipos pre-definidos

Sparkly()
{
    llParticleSystem([
        PSYS_PART_FLAGS, 0 | PSYS_PART_EMISSIVE_MASK |
         PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK |
         PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_FOLLOW_VELOCITY_MASK,
         PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_EXPLODE,
         PSYS_PART_MAX_AGE,2.000000,
         PSYS_PART_START_COLOR,<1, 1, 1>,
         PSYS_PART_END_COLOR,<0.6, 0.6, 0.6>,
         PSYS_PART_START_SCALE,<0.10000, 0.90000, 0.10000>,
         PSYS_PART_END_SCALE,<0.10000, 0.10000, 0.10000>,
         PSYS_SRC_BURST_RATE,0.10000,
         PSYS_SRC_ACCEL,<0.00000, 0.00000, 0.00000>,
         PSYS_SRC_BURST_PART_COUNT,2,
         PSYS_SRC_BURST_RADIUS,0.100000,
         PSYS_SRC_BURST_SPEED_MIN,0.100000,
         PSYS_SRC_BURST_SPEED_MAX,0.500000,
         PSYS_SRC_TARGET_KEY,(key)"",
         PSYS_SRC_ANGLE_BEGIN,1.550000,
         PSYS_SRC_ANGLE_END,1.540000,
         PSYS_SRC_OMEGA,<0.00000, 0.00000, 5.00000>,
         PSYS_SRC_MAX_AGE,0.000000,
         PSYS_PART_START_ALPHA,2.000000,
         PSYS_PART_END_ALPHA,0.00000
        ]);
}

Snowy()
{
    llParticleSystem([
        PSYS_PART_FLAGS, 0 | PSYS_PART_EMISSIVE_MASK |
        PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK |
        PSYS_PART_FOLLOW_SRC_MASK | PSYS_PART_FOLLOW_VELOCITY_MASK,
        PSYS_SRC_PATTERN,PSYS_SRC_PATTERN_EXPLODE,
        PSYS_PART_MAX_AGE,12.0,
        PSYS_PART_START_COLOR,<1, 0, 0>,
        PSYS_PART_END_COLOR,<0.6, 0.6, 0.6>,
        PSYS_PART_START_SCALE,<0.50000, 0.50000, 0.50000>,
        PSYS_PART_END_SCALE,<0.01000, 0.01000, 0.01000>,
        PSYS_SRC_BURST_RATE,3.0,
        PSYS_SRC_ACCEL,<0.00000, 0.00000, -0.1>,
        PSYS_SRC_BURST_PART_COUNT,3,
        PSYS_SRC_BURST_RADIUS,0.100000,
        PSYS_SRC_BURST_SPEED_MIN,0.1,
        PSYS_SRC_BURST_SPEED_MAX,0.5,
        PSYS_SRC_TARGET_KEY,(key)"",
        PSYS_SRC_OMEGA,<0.00000, 0.00000, 0.3>,
        PSYS_SRC_MAX_AGE,0.000000,
        PSYS_PART_START_ALPHA,2.000000,
        PSYS_PART_END_ALPHA,0.00000
        ]);
}

default
{
    state_entry()
    {
        Snowy(); //Mude aqui para Sparkly e veja a diferença!
    }

    touch_start(integer total_number)
    {
        state ParticlesOn;
    }
}

state ParticlesOn
{
    state_entry()
    {
        llParticleSystem([ ]); //Isso deliga a emissão 
    }

    touch_start(integer total_number)
    {
        state default;
    }
}
 
5 Respostas leave one →
  1. 2007 Setembro 26
    Marcelo permalink

    muito bom mesmo !
    Sou iniciante em lsl … e tudo funcionou direitinho !

    tank’s

    Marcelo.
    Mestrando de Programacao Matematica – PPGMNE

  2. 2007 Outubro 11
    yanns beck permalink

    achei o maximo tbm!!
    mas tenho uma sugestão
    por que você não continua falando sobre particle system
    dando esplicações,
    exemplos,
    por que todos os sites q ensinam
    são em ingles
    é por isso q quando eu kero alguma coisa
    venho logo nesse site
    continue publicando
    abraço irmão

  3. 2007 Novembro 21
    yanns beck permalink

    aiaiai …
    to esperando novas postagens sobre particulas no blOOOGG
    ;D
    pUXa c sb q eu adoro scripts
    faz uma aeee vaiiiH
    PLzzZZZ
    ;D
    BjonN Vuh
    to adorano o BLOG
    Tchau

  4. 2007 Novembro 24
    evarildosanto greggan permalink

    muitu bom esse tópico
    só eséro um outro tópico esplicando passo a passo sobre script

  5. 2008 Fevereiro 4

    Opa.. rpz.. eu estudo ciencias da computação e sou novo no SL.. será que vc poderia me indicar algum tutorial passo a passo p aprender LSL?? eu já andei pesquisando mas nao encontrei nada “agradável”.
    Curti mto teu tutorial d como fazer uma camisa. Vou testar em breve! =)
    abraços e parabens pelo Blog!

Deixe uma resposta

Note: You can use basic XHTML in your comments. Your email address will never be published.

Assine o feed destes comentários via RSS