LSL - Linden Scripting Language Trabalhando com Scripts Parte 4 Monitora: Cintia Caetano Mestrado UFF – IC 2009/011 1 Movimentação e Rotação ZERO_VECTOR Constante especial que representa o vetor <0.0, 0.0, 0.0>. ZERO_ROTATION Constante especial da rotação. Representa um valor, do tipo rotation, de <0.0,0.0,0.0,1.0>. Nota: Quando executamos llSetRot passando ZERO_ROTATION como parâmetro, estamos na verdade alinhando os eixos locais do objeto, aos eixos globais. 2 2 Movimentação e Rotação Nota: Um valor, do tipo vector, ao ser multiplicado por uma rotação, retorna uma nova posição, correspondente ao valor do ângulo informado na rotação. Vamos analisar os trechos de código separadamente para facilitar o entendimento. 3 3 Movimentação e Rotação pi = llGetPos(); cr = pi + <0.1,0.1,0.1>; rot = llEuler2Rot(<0.0, 6 * DEG_TO_RAD, 0.0>); pi = posição inicial cr = centro de rotação. É um centro imaginário, na qual nosso objeto ficará rodando sobre ele. O vector que somamos á nossa posição é que determina o ponto. rot = define com quantos graus e sobre quais eixos a movimentação se realizará. 4 4 Movimentação e Rotação pa = llGetPos(); pd = pa - cr; pr = pd * rot; np = cr + pr; llSetPos(np); pa = a posição atual do objeto pd = posição de deslocamento. É a posição atual menos o centro de rotação. pd é a posição do centro, em relação á nosso objeto. 5 5 Movimentação e Rotação pr = posição rotacionada. Rotaciona a posição do centro. O deslocamento obtido na linha anterior é multiplicado por uma rotação, e como resultado, tem uma nova orientação do vetor, de acordo com o ângulo especificado na rotação. np = nova posição. Soma á posição rotacionada do centro a posição inicial, mais o deslocamento. Obtendo uma nova posição, sempre ao redor do centro de rotação. Ao final, faz o objeto se mover em círculo. 6 6 Exercício 13 vector pi; vector pa; vector cr; vector pd; vector pr; vector np; rotation rot; default { state_entry() { pi=llGetPos(); rot=llEuler2Rot(<0.0, 6 * DEG_TO_RAD, 0.0>); cr=pi + <0.1,0.1,0.1>; } 7 7 Exercício 13 touch_start(integer total_number) { integer i; for (i=0;i<60;i++) { pa=llGetPos(); pd=pa - cr; pr=pd * rot; np=cr + pr; llSetPos(np); } } } 8 8 Exercício 13 Definiu-se um ângulo de 6º como rotação. O for executará as instruções 60 vezes. Em cada iteração, o objeto move-se 6º ao redor de nosso centro de rotação. 6 vezes 60 iterações, temos um ângulo total de 360º, ou seja, nosso objeto da uma volta completa ao redor do centro de rotação. 9 9 Exercício 14 Veremos mais um exercício para fixar os conceitos de rotação. Siga o roteiro abaixo: Bola Central Tipo esfera Tamanho X 0.2 Tamanho Y 0.2 Tamanho Z 0.2 10 10 Exercício 14 Barra Tipo cilindro Tamanho X 0.02 Tamanho Y 0.02 Tamanho Z 2 Coluna (coluna1, coluna2) Tipo cilindro Tamanho X 0.2 Tamanho Y 0.2 Tamanho Z 2 11 11 Exercício 14 Aro (aro1, aro2 e aro3) Tipo esfera Tamanho X 0.4 / 0.8 / 1.2 Tamanho Y 0.4 / 0.8 / 1.2 Tamanho Z 0.02 12 12 13 Exercício 14 Scritp para a bola Central vector pos_atual; float altura; key id; default { state_entry() { id=llGetOwner(); //coloca em id o id do dono llListen(0,"",id,""); //ativa e configura o canal 0, somente recebendo msgs do dono } 14 14 Exercício 14 //Evento Listen listen(integer canal,string nome, key id, string msg) { if(msg=="Montar") { llSetRot(ZERO_ROTATION); //Rotaciona o objeto para que os eixos se alinhem aos eixos globais pos_atual = llGetPos(); //pos_atual recebe a posição do objeto altura = llGround(pos_atual); //altura recebe um float com a altura do solo até o objeto (deslocamento) 15 15 Exercício 14 pos_atual.z = altura + 2; //o eixo z do vetor pos_atual recebe a altura do solo + 2 llSetPos(pos_atual); //Altera o posicionamento llSay(-200,(string)pos_atual); } } } 16 16 Exercício 14 Scritp para o Aro1 vector pos_atual; default { state_entry() { llListen(-200,"","",""); //ouvindo canal -200 } 17 17 Exercício 14 //Evento Listen listen(integer canal,string nome, key id, string msg) { llSetStatus(STATUS_PHYSICS, TRUE); //muda o status do Aro para físico, assim pode usar o llMoveToTarget pos_atual = (vector)msg; //transforma a mensagem ouvida em um vector e atribui a pos_atual llMoveToTarget(pos_atual, 1); //solicita que o objeto se mova a posição, com um tempo de 1 segundo llSleep(3); //script dorme por 3s, caso de colisão no caminho llSetStatus(STATUS_PHYSICS, FALSE); //retira o status físico do objeto llSetPos(pos_atual); correta //garante que esta na posição 18 18 Exercício 14 llSetRot(llEuler2Rot(<90 * DEG_TO_RAD, 0.0, 0.0>)); //rotacionamos o aro llSleep(3); //script dorme por 3s, para caso de colisão llMoveToTarget(<1.0,0.0,0.0>, PI, 1); //o objeto começa a girar em torno do eixo x, com uma velocidade de meia volta por segundo. } } 19 19 Exercício 14 Scritp para o Aro2 vector pos_atual; default { state_entry() { llListen(-200,"","",""); } listen(integer canal, string nome, key id, string msg) { 20 20 Exercício 14 llSetStatus(STATUS_PHYSICS,TRUE); pos_atual =(vector)msg; llMoveToTarget(pos_atual,1); llSleep(3); llSetStatus(STATUS_PHYSICS,FALSE); llSetPos(pos_atual); llSetRot(llEuler2Rot(<90* DEG_TO_RAD, 0.0, 0.0>)); llSleep(3); llTargetOmega(<1.0,0.0,0.0>,PI * 1.5,1); } } 21 21 Exercício 14 Scritp para o Aro3 vector pos_atual; default { state_entry() { llListen(-200,"","",""); } listen(integer canal, string nome, key id, string msg) { 22 22 Exercício 14 llSetStatus(STATUS_PHYSICS,TRUE); pos_atual =(vector)msg; llMoveToTarget(pos_atual,1); llSleep(3); llSetStatus(STATUS_PHYSICS,FALSE); llSetPos(pos_atual); llSetRot(llEuler2Rot(<90*DEG_TO_RAD, 0.0, 0.0>)); llSleep(3); llTargetOmega(<1.0,0.0,0.0>,TWO_PI,1); } 23 23 Exercício 14 state_exit() { llResetScript(); } } 24 24 Exercício 14 Scritp para a Barra vector pos_atual; default { state_entry() { llListen(-200,"","",""); llSetStatus(STATUS_PHANTOM,TRUE); } 25 25 Exercício 14 listen(integer canal, string nome, key id, string msg) { llSetStatus(STATUS_PHYSICS,TRUE); pos_atual =(vector)msg; llMoveToTarget(pos_atual,1); llSleep(3); llSetStatus(STATUS_PHYSICS,FALSE); llSetPos(pos_atual); llSetRot(llEuler2Rot(<0.0, 90 * DEG_TO_RAD,0.0>)); } } 26 26 Exercício 14 Scritp para a Coluna1 vector pos_atual; default { state_entry() { llListen(-200,"","",""); llSetStatus(STATUS_PHANTOM,TRUE); } 27 27 Exercício 14 listen(integer canal, string nome, key id, string msg) { llSetStatus(STATUS_PHYSICS,TRUE); pos_atual =(vector)msg; pos_atual =< pos_atual.x - 1, pos_atual.y, pos_atual.z - 1>; llMoveToTarget(pos_atual,1); llSleep(3); llSetStatus(STATUS_PHYSICS,FALSE); llSetPos(pos_atual); llSetRot(ZERO_ROTATION); } 28 } 28 Exercício 14 Scritp para a Coluna2 vector pos_atual; default { state_entry() { llListen(-200,"","",""); llSetStatus(STATUS_PHANTOM,TRUE); } 29 29 Exercício 14 listen(integer canal, string nome, key id, string msg) { llSetStatus(STATUS_PHYSICS,TRUE); pos_atual =(vector)msg; pos_atual =< pos_atual.x + 1, pos_atual.y, pos_atual.z - 1>; llMoveToTarget(pos_atual,1); llSleep(3); llSetStatus(STATUS_PHYSICS,FALSE); llSetPos(pos_atual); llSetRot(ZERO_ROTATION); } 30 } 30 31 Bibliográfia Guia de Script no Second Life. By Valdinei Rodrigues dos Reis Creating Your World: The Official Guide to Advanced Content Creation for Second Life. by Aimee Weber, Kimberly Rufer-Bach and Richard Platel. Wiley Publishing, Inc. ISBN: 978-0-470-17114-1 Second Life For Dummies. By Sarah Robbins, Mark Bell. Wiley Publishing, Inc. ISBN: 978-0-470-18025-9. Second Life: o Guia Oficial. By A P Watt Ltd. Editora: Ediouro. Ano: 2007. Edição: 1. ISBN: 9788500019616. LSL Guide http://wiki.secondlife.com/wiki 32 32