AM533A - Computação Gráfica e Multimídia I

Utilização do VRML

Texto: Elisa Calhau de Castro e Léo Pini Magalhães

1o semestre de 1999

Aula 3


O que será visto nesta aula:

  XI - Sensores


XI - Sensores
          XI.1 - Introdução

                        A fim de possibilitar a interação do usuário com a cena, existem nodos especiais chamados sensores (ou sensor nodes). Estes nodos, além de campos (fields), possuem, em geral, eventos (events). Basicamente, os sensores reagem a algum evento, o qual, por sua vez, indica que algo aconteceu, como por exemplo, que o valor de algum campo foi alterado, o mouse foi clicado ou simplesmente que transcorreu um certo período de tempo.
                        Os nodos sensores referem-se ou monitoram as geometrias definidas como children do nodo que também é seu "pai" (via de regra, um nodo Group). Na literatura, diz-se que os sensores atuam sobre as geometrias irmãs ou sibling geometries.
                        Os nodos sensores são listados a seguir. Os links referem-se ao Tutorial. Cada qual será abordado mais detalhadamente nas próximas secões.

          XI.2 - Nodos Sensores

                    XI.2.1- Anchor

                          Anchor {

          eventIn      MFNode   addChildren
          eventIn      MFNode   removeChildren
          exposedField MFNode   children        []
          exposedField SFString description     ""
          exposedField MFString parameter       []
          exposedField MFString url             []
          field        SFVec3f  bboxCenter      0 0 0
          field        SFVec3f  bboxSize        -1 -1 -1
        }
 
 

Campos 

                                    Descrição 

children

objetos, na cena, que contém hiperlinks para outros arquivos (os quais foram especificados no campo url). Na maioria dos browsers, um click num dos objetos definido em children, faz com que o arquivo especificado seja carregado.

description

prompt que o browser pode mostrar na tela em vez de ou em adição a URL. 

parameter

informação adicional para o browser VRML ou HTML. Esta informação corresponde a um string na forma keyword=value. 

url

especifica a URL dos arquivos a serem carregados. Caso várias URLs sejam especificadas, estas são listadas em ordem decrescente de prioridade, sendo que o browser carrega o primeiro arquivo que ele encontrar.

bboxCenter

centro da área retangular hipotética que circunda os objetos especificados em children no nodo Anchor

bboxSize

dimensões em x, y e z da área retangular hipotética que circunda os objetos especificados em children no nodo Anchor

Eventos

           eventIn                                     MFNode

addChildren

adiciona o nodo especificado na lista de objetos em children do nodo Anchor. Caso este nodo já exista, a nova inclusão é ignorada

removeChildren

remove o nodo especificado da lista de objetos em children do nodo Anchor. Caso este nodo não exista, a remoção é ignorada

 Nota: URL - Uniform Resource Locator ( IETF RFC 1738 Uniform Resource Locator, Internet standards track protocol. http://ds.internic.net/rfc/rfc1738.txt). Corresponde ao endereço de acesso a um arquivo na Web.

                      Este nodo provê "links" para outras cenas, páginas HTML ou mesmo para arquivos de som ou imagem localizados em qualquer local na Web. Caso se especifique um arquivo VRMl, este substituirá a cena corrente.
                        O arquivo para o qual o link aponta é especificado no campo url. Este arquivo tanto pode ser externo como local. No campo children, são definidos os objetos que, ao serem clicados pelo usuário, ativam o link. Pode-se também, prover uma descrição para o link, bastando preencher o campo description; esta descrição é, então, visualizada sempre que o usuário mover o cursor sobre o(s) objeto(s) especificados no campo children.

                        Maiores informações em Anchor Node no Tutorial.
 

                XI.2.2 - CylinderSensor
 

                      CylinderSensor {

  exposedField SFBool    autoOffset TRUE
  exposedField SFFloat   diskAngle  0.262
  exposedField SFBool    enabled    TRUE
  exposedField SFFloat   maxAngle   -1
  exposedField SFFloat   minAngle   0
  exposedField SFFloat   offset     0
  eventOut     SFBool     isActive
  eventOut     SFRotation rotation_changed
  eventOut     SFVec3f    trackPoint_changed
}
 
 
 

         Campo 

                                              Descrição 

minAngle

menor ângulo de rotação admissível

maxAngle

maior ângulo de rotação admissível

enable

indica se o sensor está ativado. Para desligá-lo, basta enviar-lhe um evento set_enable com o valor FALSE

diskAngle

determina um ângulo em relação ao eixo Y, dentro do qual o sensor se comporta como um "disco imaginário" e, fora dele, como um "cilindro imaginário". Este pode ser entendido como  o  ângulo do vértice de um cone inscrito no "cilindro imaginário" e com a base correspondendo com a tampo do cilindro. Logo, o comportamento do sensor depende de onde o usuário clica no objeto.

offset

especifica o ângulo em radianos em que a geometria associada será rotacionada a cada "arrasto".

autoOffset

sendo TRUE, indica que, uma vez rotacionada, a geometria mantém a nova posição, a qual passará a ser a posição inicial para a nova rotação. Caso FALSE, antes da nova rotação, a geometria é trazida novamente à sua posição original

          Eventos

           eventOut

isActive

enviado quando o usuário começa a arrastar a geometria

trackPoint_changed

ponto de contato do cursor com o "cilindro imaginário" 

rotation_changed

orientação corrente do "cilindro"durante o arrasto


 

                       O nodo CylinderSensor é capaz de interpretar quando o usuário "arrasta" um objeto 2D, através do mouse, como uma rotação deste objeto no espaço 3D ao redor do eixo y. Esta rotação, dependendo de onde o cursor toca o objeto (em relação ao eixo y), pode se dar de duas maneiras distintas que serão abordadas adiante. "Arrastar", neste contexto, significa mover o cursor enquanto se pressiona o botão do mesmo.
                        Quando o usuário pressiona o botão do mouse, enquanto aponta para um dos objetos (geometrias) definido no campo children do seu nodo pai (parent node), o browser considera um cilindro imaginário ao redor do eixo y do sistema local de coordenadas do sensor. O tipo de movimento a ser obtido é dependente do campo diskAngle (vide tabela acima), podendo ser similar à rotação de um cilindro ou similar à rotação de um LP num toca-discos.

  Maiores informações em CylinderSensor Node no Tutorial.
 

Link para Node Route

Link para Prototipação

               

            XI.2.3 - PlaneSensor
 

PlaneSensor {
  exposedField SFBool  autoOffset          TRUE
  exposedField SFBool  enabled             TRUE
  exposedField SFVec2f maxPosition         -1 -1
  exposedField SFVec2f minPosition         0 0
  exposedField SFVec3f offset              0 0 0
  eventOut     SFBool  isActive
  eventOut     SFVec3f trackPoint_changed
  eventOut     SFVec3f translation_changed
}
 
 
 

        Campo 

                                                         Descrição 

minPosition

a translação fica restrita a pontos à direita e acima desta posição no plano xy

maxPosition

a translação fica restrita a pontos à esquerda e abaixo desta posição no plano xy

enable

indica se o sensor está ativado. Para desligá-lo, basta enviar-lhe um evento set_enable com o valor FALSE

offset

especifica o quanto (a distância) a geometria será trasladada cada vez que ocorrer o arrasto

autoOffset

sendo TRUE, indica que, uma vez tranladada, a geometria mantém a nova posição, a qual passará a ser a posição inicial para a nova translação. Caso FALSE, antes da nova translação, a geometria é trazida novamente à sua posição original

       Eventos 

           eventOut 

isActive

este evento é enviado toda vez que o usuário pressionar ou soltar o botão (imediatamente antes ou após o arrasto respectivamente) e não durante o arrasto

trackPoint_changed

ponto para o qual o usuário aponta o cursor, ao longo do plano xy, durante o arrasto; minPosition e maxPosition são ignorados

translation_changed

ponto ao longo do plano xy e dentro dos limites permitidos (minPosition e maxPosition) para o qual o cursor é apontado; caso o usuário tenha apontado o cursor para uma posição fora dos limites, um dos valores minPosition ou maxPosition é assumido conforme o caso

                        Este nodo interpreta um movimento de "arrasto" como uma translação no plano xy de coordenadas do sensor sempre que o usuário clica sobre um objeto e o arrasta. Esse objeto corresponde a uma geometria definida no campo children do nodo que é pai do sensor em questão.
                        Em geral, esse nodo é bem semelhante ao CylinderSensor descrito anteriormente.
                        Pode-se limitar a translação, atribuindo-se valores mínimo e máximo para os campos minPosition e maxPosition respectivamente e, assim, restringir os eventos translation_changed dentro de um retângulo imaginário, pertencente ao plano xy,  cujas extremidades correspondem a esses valores mínimo e máximo. Interessante notar que, se os valores de x ou de y em minPosition e maxPosition forem iguais, o movimento de translação fica restrito àquela  direção, transformando o PlaneSensor num "line sensor" por assim dizer.
                        A geometria transladada pode ser mantida na nova posição (autoOffset = TRUE) ou, antes de uma nova translação, retornar à posição original (autoOffset = FALSE).
                        Outros sensores tipo "drag sensors"(CylinderSensor e SphereSensor) não geram eventos enquanto o PlaneSensor estiver ativado (durante o arrasto).
                       

                        Maiores informações, vide PlaneSensor no Tutorial.
 

            XI.2.4 - SphereSensor

     SphereSensor {
  exposedField SFBool     autoOffset        TRUE
  exposedField SFBool     enabled           TRUE
  exposedField SFRotation offset            0 1 0 0
  eventOut     SFBool     isActive
  eventOut     SFRotation rotation_changed
  eventOut     SFVec3f    trackPoint_changed
}
 
 

     Campos 

                                        Descrição

enable

indica se o sensor está ativado. Para desligá-lo, basta enviar-lhe um evento set_enable com o valor FALSE

offset

especifica o quanto (a distância) a geometria será rotacionada cada vez que 
ocorrer o arrasto

autoOffset

sendo TRUE, indica que, uma vez rotacionada, a geometria mantém a nova posição, a qual passará a ser a posição inicial para a nova rotação. Caso FALSE, antes da nova rotação, a geometria é trazida novamente à sua 
posição original

   Eventos 

            eventOut

isActive

indica se o usuário está arrastando a geometria associada ao sensor

trackPoint_changed

ponto para o qual o usuário aponta o cursor, ao longo da esfera, durante o 
arrasto

translation_changed

orientação da esfera imaginária durante o arrasto

Maiores informações, vide SphereSensor no Tutorial.
 

            XI.2.5 - TouchSensor

     TouchSensor
{
  exposedField SFBool  enabled TRUE
  eventOut     SFVec3f hitNormal_changed
  eventOut     SFVec3f hitPoint_changed
  eventOut     SFVec2f hitTexCoord_changed
  eventOut     SFBool  isActive
  eventOut     SFBool  isOver
  eventOut     SFTime  touchTime
}
 
 

   Campos 

                                    Descrição

enable

indica se o sensor está ativado

   Eventos 

      eventOut

isOver

indica se o usuário está apontando o cursor para uma geometria monitorada pelo sensor, independentemente de o botão do mouse ter ou não sido pressionado

isActive

indica se o botão está sendo pressionado 

hitPoint_changed

mais recente ponto da superfície da geometria monitorada pelo sensor que foi clicado pelo usuário

hitNormal_changed

normal no ponto indicado pelo hitPoint_changed

hitTexCoord_changed

textura associada ao ponto indicado pelo hitPoint_changed

touchTime

instante em que houve o click ( usuário "tocou" a figura)

Maiores informações, vide TouchSensor no Tutorial.
 

                 XI.2.6 - Collision
                    XI.2.6.1 - Introdução
                    XI.2.6.2 - Sintaxe

         Collision
{
  eventIn      MFNode   addChildren
  eventIn      MFNode   removeChildren
  exposedField MFNode   children        []
  exposedField SFBool   collide         TRUE
  field        SFVec3f  bboxCenter      0 0 0
  field        SFVec3f  bboxSize        -1 -1 -1
  field        SFNode   proxy           NULL
  eventOut     SFTime   collideTime
}
 
 

   Campos 

                                     Descrição

children

objeto(s) que são verificados se colidiram ou não

collide

indica se a deteção de colisão para os objetos está ligada (TRUE) ou não (FALSE)

proxy

objeto alternativo a ser verificado em vez daqueles especificados em children

bboxCenter

centro do box imaginário que circunda os objetos em children

bboxSize

dimensões em x, y e z do  box imaginário que circunda os objetos em children

   Eventos

 

addChildren

adiciona um objeto ao campo children. Caso já exista, a inclusão é ignorada

removeChildren

remove um objeto do campo children. Caso não exista, a exclusão é ignorada

collideTime

momento da colisão

 

Maiores informações, vide Collision no Tutorial.
 

            XI.2.7- ProximitySensor

            ProximitySensor {
  exposedField SFVec3f    center      0 0 0
  exposedField SFVec3f    size        0 0 0
  exposedField SFBool     enabled     TRUE
  eventOut     SFBool     isActive
  eventOut     SFVec3f    position_changed
  eventOut     SFRotation orientation_changed
  eventOut     SFTime     enterTime
  eventOut     SFTime     exitTime
}
 
 

   Campos 

                                          Descrição

center

centro da região monitorada pelo sensor na detecção de movimentos

size

extensão, ao longo dos três eixos e do center definido, da região de monitoramento do sensor 

enable

indica se o sensor está ativado. Para desligá-lo, envie um evento set_enable FALSE para o sensor

   Eventos 

              eventOut

position_changed

atual posição do usuário. É atualizado sempre que o usuário se desloca dentro da região monitorada ou sai dela

orientation_changed

atual orientação do usuário. É atualizado sempre que o usuário se desloca dentro da região monitorada ou sai dela

enterTime

instante em que o usuário penetra na região de monitoramento

exitTime

instante em que o usuário sai na região de monitoramento

isActive

indica se o usuário entrou (TRUE) na região de monitoramento ou não (FALSE)

           

Maiores informações, vide ProximitySensor no Tutorial.
 

XI.2.8 - TimeSensor
 

TimeSensor
{

  exposedField SFTime   cycleInterval 1
  exposedField SFBool   enabled       TRUE
  exposedField SFBool   loop          FALSE
  exposedField SFTime   startTime     0
  exposedField SFTime   stopTime      0
  eventOut     SFTime   cycleTime
  eventOut     SFFloat  fraction_changed
  eventOut     SFBool   isActive
  eventOut     SFTime   time
}
 
 

   Campos 

                                                            Descrição

cycleInterval

duração em segundos de cada intervalo (deve ser maior que zero)

enabled

caso TRUE, "eventos relacionados ao tempo" são gerados de acordo com certas condições (que envolvem o instante atual e outros campos) e, caso FALSE, esses eventos não são gerados. Os eventos tipo: set_ e _changed são tratados normalmente, independentemente do valor enable ser TRUE ou FALSE 

loop

estabelece se o sensor deve repetir indefinidamente (até stopTime) ou parar ao final de um ciclo

startTime

instante de início da geração de eventos

stopTime

instante de término da geração de eventos ( ignorado se menor que startTime)

   Eventos 

               eventOut

isActive

indica se o sensor está em funcionamento. Este evento só é enviado no instante em que o sensor começa a funcionar e quando pára 

cycleTime

instante atual, enviado a cada início de ciclo

fraction_changed

fração completada do ciclo corrente: 0 (início) até 1 (fim)

time

data/hora atual em segundos desde 00:00 GMT, 01 de janeiro de 1970.

Maiores informações, vide TimeSensor no Tutorial.
 

            XI.2.9 - VisibilitySensor

      VisibilitySensor
{

  exposedField SFVec3f center   0 0 0
  exposedField SFBool  enabled  TRUE
  exposedField SFVec3f size     0 0 0
  eventOut     SFTime  enterTime
  eventOut     SFTime  exitTime
  eventOut     SFBool  isActive
}
 
 

   Campos 

                                                  Descrição

center

centro da região retangular que ativa e desativa o sensor

size

extensão, ao longo dos três eixos x, y e z da região retangular que ativa e desativa o sensor 

enabled

indica se o sensor está ativado. Caso FALSE, eventos não são gerados e, caso TRUE, o sensor detecta alterações nas "condições de visibilidade" ( visibility status) da região monitorada e envia eventos através de isActive

   Eventos 

 

isActive

valor TRUE indica que parte da região monitorada está visível e, quando FALSE, a região está completamente invisível

enterTime

instante em que foi gerado um isActive TRUE

exitTime

instante em que foi gerado um isActive FALSE

 

Maiores informações, vide VisibilitySensor no Tutorial.
 

            Exercícios:

1. Para o sensor ANCHOR :

    1. mude o exemplo de aula alterando os Viewpoint
    2. mude o exemplo para carregar uma nova página ao invés de alterar o Viewpoint (se for o caso altere também).

 

2. Para o sensor CYLINDERSENSOR faça exemplos a partir do exemplo dado em aula.

 

3. Repita o exercício 2 para SPHERESENSOR.