Desenvolvimento - LSL (Second Life)

Second Life: Criando instâncias de objetos via código

Este texto demonstra como instanciar objetos via código e ainda obter um efeito visualmente interessante usando a Linden Scripting Language.

por Vagner Candido de Sousa



Este documento traz uma demonstração sobre como criar novas instâncias de objetos via código, além de obter um efeito visualmente interessante e que pode ser facilmente adaptado para outras infinitas possibilidades mais práticas.

Para este exemplo e utilizando uma primitiva com dimensões de, digamos, 10 x 2 x 0.1 metros, teremos o seguinte resultado:

Para tanto, é necessário apenas que o script a seguir e uma cópia do objeto a ser replicado sejam colocados no inventário da primitiva principal. Esta mesma primitiva fará cópias do objeto, sendo que as novas instâncias são posicionadas estrategicamente, resultando numa forma mais atraente regida por um padrão de comportamento específico.

Neste caso, as cópias terão um deslocamento vertical para cima composto com uma pequena rotação em torno do eixo Z, de maneira que a altura da figura como um todo não ultrapasse 10 metros e que a resultante desses incrementos de rotação complete uma volta de giro.

Na verdade, o código é mais simples do que a explicação, mas, de qualquer forma, o que nos interessa, principalmente, são as equações para determinar a posição e a rotação de cada nova instância.

Para a posição, basta acrescentar à altura do último objeto o incremento desejado, que neste exemplo é a relação entre a altura máxima pretendida o número total de objetos. Outra maneira, mais conveniente em termos de programação, é acrescentar à posição da primitiva principal o produto entre o número da cópia atual e o incremento, resultando também no offset desejado. Por fim, a posição será dada por, simplesmente,

llGetPos() + 

Para a rotação, um raciocínio análogo é aplicado. Desejamos que cada objeto tenha uma pequena rotação em relação ao anterior, mas que entre o primeiro e o último objeto, tenhamos completado uma volta de giro. Como uma volta completa são 360 graus ou 2*PI radianos, nosso incremento angular será dado pela razão entre 360º e o número total de objetos. Em relação à primitiva root, o offset angular para cada objeto será dado por, também simplesmente e utilizando a notação de Euler,



Daí, o restante do código apenas executa as iterações necessárias para criação das cópias, como pode ser visto completamentamente a seguir:

default
{
    state_entry()
    {
        llSay(0, "Ola, avatar! Toque no objeto para ver o resultado.");
    }

    touch_start(integer total_number)
    {
       integer objetos = 30;
       integer atual;

       for (atual = 1; atual ;

           float incAngular = atual * TWO_PI / objetos;
           rotation rot = llEuler2Rot();

           llRezObject("Object", pos, ZERO_VECTOR, rot, 0);
       }
    }
}

Como sempre, a matemática nos ajudando. Daí para uma árvore de natal auto-montável basta um pulo. E pensar que o objeto inicial era apenas uma tábua de madeira, como mostrado pelo meu avatarzinho mau-encarado:

Resumindo, é isso. Qualquer dúvida, sugestão ou correção é sempre muito bem-vinda. Abraço e sucesso à todos.

Vagner Candido de Sousa

Vagner Candido de Sousa - Engenheiro de computação, atuou em empresas como Techs Corp e Kaizen Games. Atualmente desenvolve soluções georreferenciadas para agricultura de precisão na AGX Tecnologia.