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
Download

Aula de LSL — Parte 4