LSL - Linden Scripting Language
Trabalhando com Scripts
Parte 3
Monitora: Cintia Caetano
Mestrado
UFF – IC
2009/011
1
Movimentação e Rotação

Na vida real, nos preocupamos apenas em ir
para frente, para trás, para algum lado, vários
aspectos relacionados a movimentação são
totalmente desnecessários para que
possamos viver sem problemas.

Já no SL, certos fundamentos de física são
necessários.

Vamos verificar alguns conceitos necessários,
e depois vamos ver e estudar algumas
funções relacionadas.
2
2
Movimentação e Rotação

No SL, temos também os pontos cardeais,
que podem ser verificados observando o minimapa.

Como na vida real, também pode andar para
frente, de costas, e para os lados.

Isso não se aplica somente a você, os
diversos objetos, incluindo veículos, balas,
etc., também fazem uso destes dois sistemas
de referência.
3
3
4
Global X Local

No SL, definimos nossos movimentos e
rotações para serem executados local ou
globalmente.

Global - é toda movimentação ou rotação
relativa a norte, sul, leste e oeste (ao mundo).
Uma movimentação global não leva em conta
se você, assim como seu objeto, esta de lado,
de frente ou de costas.
5
5
Global X Local

Local – é toda movimentação ou rotação
relativa unicamente a você, ou ao objeto.

Não importa se é norte ou sul, se esta de
frente para onde deseja chegar, está indo para
frente, se o seu destino esta atrás de você,
está andando de costas, e se deseja chegar a
um local que esta em um dos seus lados, esta
andando de lado.
6
6
Representação Matemática

Utiliza-se o plano cartesiano para representar
tanto a movimentação global quanto a local.

O plano cartesiano é composto de três retas, a
qual chamamos a cada uma de: eixo x, eixo y
e eixo z.

O eixo x representa, no SL, a movimentação
relativa à Leste-Oeste.
O eixo y a movimentação relativa à Norte-Sul.
O eixo z é relativo à altitude.


7
7
Representação Matemática

No SL, a unidade de medida é metros,
alcançando um precisão de até 1 milímetro.

Com isto temos que nossos eixos poderão
variar de 0,001 metros (um milímetro) até o
limite da região onde estamos.

Nota: Cada território é um quadrado 255x255.

Ao trabalhar com movimentação, usaremos
um valor do tipo vector.
<float, float, float>

8
8
Representação Matemática

Crie um novo objeto, e verifique os eixos de
movimentação sobre ele.

Observe no mini-mapa os pontos cardeais que
eles apontam.

Observe que o eixo x (cor vermelha), o eixo y
(cor verde) e o eixo z (cor azul).

Na opção girar, observe que as cores
continuam indicando exatamente sobre qual
eixo giram.
9
9
Representação Matemática

Por mais que movimente e gire seu objeto, os
eixos permanecem inalterados.

Este comportamento é devido ao fato de
estarmos utilizando referencia global.
10
10
Representação Matemática

Todo objeto, mesmo uma bola, possui uma
face, ou lado, que é considerado como sua
frente.

Caso emitirmos um comando para o objeto ir
para frente, é a direção em que esta face
aponta que nosso objeto seguira.
11
11
llGetPos / llSetPos





llGetPos();
Esta função simplesmente retorna um valor do
tipo vector, representado a localização do
objeto, em relação ao território onde esta.
llSetPos(posição);
Informa ao objeto qual será sua nova posição.
O valor passado como argumento da função é
um vector com as coordenadas desejadas.
Não funciona para objetos físicos.
12
12
llSetPos

O objeto não se desloca até chegar a posição
final, ele vai direto á posição informada.

Esta função possui um delay de 0.2 segundos.

Temos uma limitação de 10 metros na distância
que definimos como destino.

Nota: Se desejarmos que o objeto suba 30
metros, devemos fazer um loop para que a
função seja executada 3 vezes, especificando
10 metros como incremento em seu eixo z.
13
13
llVecDist


llVecDist(posição1, posição2);
Utilizado para saber a distância exata entre
dois objetos.

Retorna um float contendo a distância entre a
posição 1 e a posição 2.

Passa o vector da posição de cada um deles
com primeiro e segundo argumento.
14
14
llVecMag


llVecMag(posição);
Esta função retorna a distância que a posição
passada como argumento esta da posição
<0.0,0.0,0.0>.

Esta função retorna um float.

A distância é expressada em metros.
15
15
llGround / llStopMoveToTarget




llGround(deslocamento);
Retorna um float com a altura da terra, na
posição especificada por deslocamento.
llStopMoveToTarget();
Faz o objeto parar de se mover.
16
16
llMoveToTarget




llMoveToTarget(posição, tempo);
Esta função atua sobre objetos físicos,
fazendo com que o objeto alcance a posição
passada como parâmetro, dentro do tempo
(em segundos).
Nota: o objeto se mantém movimentando para
a posição, mesmo depois de chegar a ela.
Seria como se disséssemos ao objeto, “movase para tal posição, em tantos segundos, e
permaneça lá ate outra ordem”.
17
17
llMoveToTarget

A posição especificada não pode estar a mais
de 66 metros de distância.

Se especificarmos um tempo de 0.0
segundos, o objeto para de se mover.
18
18
Relembrado Rotation

Este tipo manipula rotações.

Representa um elemento matemático
chamado de quaternion.

É formado pelos eixos x, y e z, e um quarto
número, representa se a rotação será pela
esquerda ou direita.

Em SL, para acessar cada elemento deste
vetor, especificando .x, .y, .z ou .s
19
19
Graus e Radiandos

Escalas que medem as rotações de um objeto.

Infelizmente, o SL não trabalha diretamente
com graus, e sim com radianos. 

Porém, temos algumas facilidades (funções)
que nos permitem converter de graus para
radianos sem maiores dificuldades. 
20
20
Graus e Radiandos

Para nós, o importante é saber que:

360º = 2 * PI = TWO_PI radianos
Nota: PI é uma constante matemática que vale
aproximadamente 3,14.


Para especificar uma rotação de 360º em
radianos, utilizamos 2*P ou TWO_PI.
21
21
Graus e Radiandos




180º = PI radianos (mesmo racionio anterior)
Para especificar uma rotação de 180º em
radianos, utilizamos PI
90º = PI_BY_TWO = PI/2 radianos
Para especificar uma rotação de 360º em
radianos, utilizamos PI_BY_TWO
22
22
Graus e Radiandos






DEG_TO_RAD
Graus para Radianos.
Quando o ângulo (em radianos) não for um
dos casos falados anteriormente, podemos
converte-lo para radianos multiplicando o
mesmo pela constante DEG_TO_RAD.
RAD_TO_DEG
Converte radianos para graus.
Nota: as constantes citadas acima são em
MAIUSCULAS.
23
23
Euler

Leonhard Euler foi um matemático e físico que
desenvolveu um sistema de referência
chamado Ângulos de Euler.

Para dar uma orientação a um objeto
específico, é necessário submetê-lo a uma
seqüência de três rotações descritas pelos
ângulos de Euler.

Trabalhar diretamente com o tipo rotation
não é tarefa fácil.
24
24
Euler

Precisamos especificar o valor de rotação (em
radianos, para cada eixo, e especificar o
sentido e quantidade de rotações.

Para facilitar nossa vida, podemos usar um
valor do tipo vector, na qual apenas
trabalharemos com 3 valores, representando
cada um dos eixos.
25
25
Euler

Esta forma de representar rotações, é
conhecida com Representação Euler de uma
rotação.

A representação de Euler pode ser convertida
para Rotation através de funções.

Na representação Euler trabalha com graus.

Sendo assim, além de convertê-la para
rotation, também precisamos converter os
valores em graus para radianos.
26
26
Euler

Quando emitimos um comando para que um
objeto se mova, temos 2 opções:
1.
Sabemos para qual posição queremos
que nosso objeto se mova, relativo a
região em que esta. Podemos usar
llSetPos para objetos não físicos, e
llMoveToTarget para objetos físicos.
27
27
Euler
2.
Quisermos que o objeto se mova para
frente, tantos metros. Precisamos
conhecer a rotação de um objeto, para
saber se aponta para a direção correta
que queremos que se mova, caso esteja
fora da rotação adequada, teremos que
saber quanto e sobre qual eixo rotacionar
o objeto, para que nosso movimento seja
exato.
28
28
llEuler2Rot


llEuler2Rot(rotação);
Retorna um valor do tipo rotation, a partir do
vector rotação passado como argumento.

Após definirmos uma rotação, na
representação Euler, convertemos para
rotation passando a mesma para esta função.

Observe que precisamos também converter o
valor em graus para radianos, fazendo uso
da constante DEG_TO_RAD.
29
29
llRot2Euler



llRot2Euler(rotação);
O inverso da função anterior. Transforma o
valor do tipo rotation passado como
parâmetro, para um vector em representação
Euler.
Nota: Não se esqueça de usar a constante
RAD_TO_DEG para transformar os radianos
em graus.
30
30
llGetRot / llSetRot





llGetRot();
Retorna um valor do tipo rotation, representando a orientação do objeto.
llSetRot(rotação);
Esta função rotaciona o objeto para a nova
orientação, especificada pelo parâmetro
passado com um valor do tipo rotation.
Funciona apenas com objetos não-físicos.
31
31
llTargetOmega


llTargetOmega(eixo,volta,força);
Esta função rotaciona um objeto sobre o eixo
especificado pelo valor do tipo vector, passado
como parâmetro.

O argumento volta, é uma valor do tipo float, e
especifica o número de revoluções (voltas,
girar em torno do eixo especificado) que o
objeto fará.

As revoluções são em radianos por segundo,
e basicamente determina quão rápido nosso
objeto ira girar.
32
32
llTargetOmega

O último parâmetro, força, é útil apenas em
objetos físicos, apesar de não poder ser 0
em objetos não físicos. Basicamente
determina a força com que o objeto ira girar.

llTargetOmega atua diferentemente em objetos
físicos e não físicos.

Objetos físicos = utiliza os eixos do objeto
(rotação local).
Objetos não-físicos = utiliza eixos globais.

33
33
Diferença

A diferença entre llTargetOmega e llSetRot

llSetRot rotaciona o objeto apenas uma vez,
orientando o mesmo na rotação indicada

llTargetOmega rotaciona o objeto
continuamente.
34
34
Exercício 7

Crie uma esfera (não-física) e insira o seguinte código:
default
{
state_entry()
{
llTargetOmega(<0.0,0.0,1.0>,TWO_PI,1);
}
}

Faz com que o objeto fique rotacionando sobre seu eixo
z. O objeto completará uma volta completa a cada
segundo.
35
35
Exercício 8

Crie um cubo (não-físico) e insira o seguinte código:
vector e_rot; //variável Euler
rotation rot; //variável rotation
default
{
state_entry()
{
}
touch_start(integer c)
{
e_rot=<50.0,90.0,90.0>; //atribui orientação ao vetor
rot=llEuler2Rot(e_rot * DEG_TO_RAD); //atribuí o retorno da
função llEuler2Rot sobre o vetor Euler - retorna um valor do tipo rotation
llSetRot(rot); //rotaciona o objeto
}
}
36
36
Exercício 9
//Não consegue um movimento uniforme devido ao delay da função llSetRot.
vector e_rot=<0.0,0.0,45.0>; //declara vetor e atribui uma rotação de 45º em z
rotation rot;
default
{
state_entry()
{
llSetTimerEvent(0.1); //prepara o evento timer p/ responder a cada 1 seg.
rot=llGetRot(); //guarda a orientação atual na variável rot
e_rot=e_rot * DEG_TO_RAD; //transforma graus em radianos
}
//evento Timer
timer()
{
rot= rot * llEuler2Rot(e_rot);
llSetRot(rot); //atualiza a orientação do objeto, girando em mais 45º graus
}
}
37
37
Exercício 10

Crie um objeto físico e coloque o seguinte código:
default
{
state_entry()
{
llTargetOmega(<0.0,0.0,1.0>,TWO_PI,1.0);
}
touch_start(integer c)
{
llMoveToTarget(<60.0,150.0,40.0>,5);
llSetTimerEvent(2);
}
timer()
{
llStopMoveToTarget();
llSetTimerEvent(0.0);
}
}
38
38
Exercício 11
default
{
state_entry()
{
llSetText(" Objeto que gira sem parar ", <0.0,1.0,0.0>,1.0);
// rotacionando o eixo x uma vez por segundo
// rotacionando o eixo y 3 vez por segundo
// rotacionando o eixo z uma vez por segundo
llTargetOmega(<1.0,3.0,1.0>,TWO_PI,1.0);
}
}
39
39
Exercício 12
default
{
state_entry()
{
llSetText(" Clique para girar ", <0.0,1.0,0.0>,1.0);
state voltar;
}
}
state ir
{
touch_start(integer total_number)
{
llSetText(" Clique para parar ", <0.0,1.0,0.0>,1.0);
llTargetOmega(<1.0,3.0,0.5>,TWO_PI,1.0);
state voltar;
}
}
40
40
Exercício 12
state voltar
{
touch_start(integer total_number)
{
llTargetOmega(<0.0,0.0,0.0>,0,0.0);
llSetText(" Clique para girar ", <0.0,1.0,0.0>,1.0);
state ir;
}
}
41
41
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
42
42
Download

Aula de LSL — Parte 3