LSL Linden Scripting Language Trabalhando com Scripts Parte
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>. ZERO_ROTATION Constante especial da rotação. Representa um valor, do tipo rotation, de <0. 0, 1. 0>. Nota: Quando executamos ll. Set. Rot 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 = ll. Get. Pos(); cr = pi + <0. 1, 0. 1>; rot = ll. Euler 2 Rot(<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 = ll. Get. Pos(); pd = pa - cr; pr = pd * rot; np = cr + pr; ll. Set. Pos(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=ll. Get. Pos(); rot=ll. Euler 2 Rot(<0. 0, 6 * DEG_TO_RAD, 0. 0>); cr=pi + <0. 1, 0. 1>; } 7 7
Exercício 13 touch_start(integer total_number) { integer i; for (i=0; i<60; i++) { pa=ll. Get. Pos(); pd=pa - cr; pr=pd * rot; np=cr + pr; ll. Set. Pos(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 (coluna 1, coluna 2) Tipo cilindro Tamanho X 0. 2 Tamanho Y 0. 2 Tamanho Z 2 11 11
Exercício 14 Aro (aro 1, aro 2 e aro 3) 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=ll. Get. Owner(); //coloca em id o id do dono ll. Listen(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") { ll. Set. Rot(ZERO_ROTATION); //Rotaciona o objeto para que os eixos se alinhem aos eixos globais pos_atual = ll. Get. Pos(); //pos_atual recebe a posição do objeto altura = ll. Ground(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 ll. Set. Pos(pos_atual); //Altera o posicionamento ll. Say(-200, (string)pos_atual); } } } 16 16
Exercício 14 Scritp para o Aro 1 vector pos_atual; default { state_entry() { ll. Listen(-200, "", ""); //ouvindo canal -200 } 17 17
Exercício 14 //Evento Listen listen(integer canal, string nome, key id, string msg) { ll. Set. Status(STATUS_PHYSICS, TRUE); //muda o status do Aro para físico, assim pode usar o ll. Move. To. Target pos_atual = (vector)msg; //transforma a mensagem ouvida em um vector e atribui a pos_atual ll. Move. To. Target(pos_atual, 1); //solicita que o objeto se mova a posição, com um tempo de 1 segundo ll. Sleep(3); //script dorme por 3 s, caso de colisão no caminho ll. Set. Status(STATUS_PHYSICS, FALSE); //retira o status físico do objeto ll. Set. Pos(pos_atual); //garante que esta na posição correta 18 18
Exercício 14 ll. Set. Rot(ll. Euler 2 Rot(<90 * DEG_TO_RAD, 0. 0>)); //rotacionamos o aro ll. Sleep(3); //script dorme por 3 s, para caso de colisão ll. Move. To. Target(<1. 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 Aro 2 vector pos_atual; default { state_entry() { ll. Listen(-200, "", ""); } listen(integer canal, string nome, key id, string msg) { 20 20
Exercício 14 ll. Set. Status(STATUS_PHYSICS, TRUE); pos_atual =(vector)msg; ll. Move. To. Target(pos_atual, 1); ll. Sleep(3); ll. Set. Status(STATUS_PHYSICS, FALSE) ; ll. Set. Pos(pos_atual); ll. Set. Rot(ll. Euler 2 Rot(<90* DEG_TO_RAD, 0. 0>)); ll. Sleep(3); ll. Target. Omega(<1. 0, 0. 0>, PI * 1. 5, 1); } } 21 21
Exercício 14 Scritp para o Aro 3 vector pos_atual; default { state_entry() { ll. Listen(-200, "", ""); } listen(integer canal, string nome, key id, string msg) { 22 22
Exercício 14 ll. Set. Status(STATUS_PHYSICS, TRUE); pos_atual =(vector)msg; ll. Move. To. Target(pos_atual, 1); ll. Sleep(3); ll. Set. Status(STATUS_PHYSICS, FALSE); ll. Set. Pos(pos_atual); ll. Set. Rot(ll. Euler 2 Rot(<90*DEG_TO_RAD, 0. 0>)); ll. Sleep(3); ll. Target. Omega(<1. 0, 0. 0>, TWO_PI, 1); } 23 23
Exercício 14 state_exit() { ll. Reset. Script(); } } 24 24
Exercício 14 Scritp para a Barra vector pos_atual; default { state_entry() { ll. Listen(-200, "", ""); ll. Set. Status(STATUS_PHANTOM, TRUE); } 25 25
Exercício 14 listen(integer canal, string nome, key id, string msg) { ll. Set. Status(STATUS_PHYSICS, TRUE); pos_atual =(vector)msg; ll. Move. To. Target(pos_atual, 1); ll. Sleep(3); ll. Set. Status(STATUS_PHYSICS, FALSE); ll. Set. Pos(pos_atual); ll. Set. Rot(ll. Euler 2 Rot(<0. 0, 90 * DEG_TO_RAD, 0. 0>)); } } 26 26
Exercício 14 Scritp para a Coluna 1 vector pos_atual; default { state_entry() { ll. Listen(-200, "", ""); ll. Set. Status(STATUS_PHANTOM, TRUE); } 27 27
Exercício 14 listen(integer canal, string nome, key id, string msg) { ll. Set. Status(STATUS_PHYSICS, TRUE); pos_atual =(vector)msg; pos_atual =< pos_atual. x - 1, pos_atual. y, pos_atual. z - 1>; ll. Move. To. Target(pos_atual, 1); ll. Sleep(3); ll. Set. Status(STATUS_PHYSICS, FALSE); ll. Set. Pos(pos_atual); ll. Set. Rot(ZERO_ROTATION); } 28
Exercício 14 Scritp para a Coluna 2 vector pos_atual; default { state_entry() { ll. Listen(-200, "", ""); ll. Set. Status(STATUS_PHANTOM, TRUE); } 29 29
Exercício 14 listen(integer canal, string nome, key id, string msg) { ll. Set. Status(STATUS_PHYSICS, TRUE); pos_atual =(vector)msg; pos_atual =< pos_atual. x + 1, pos_atual. y, pos_atual. z - 1>; ll. Move. To. Target(pos_atual, 1); ll. Sleep(3); ll. Set. Status(STATUS_PHYSICS, FALSE); ll. Set. Pos(pos_atual); ll. Set. Rot(ZERO_ROTATION); } 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
- Slides: 32