Matemática e Computação
 

Nada, jamais, substituirá o companheiro perdido. Velhos camaradas não se criam. Estas amizades não se refazem: ao plantar um carvalho, é vã a esperança de poder gozar brevemente da sua sombra. (Saint-Exupéry)

 

 

6.7 - TouchSensor

O nó TouchSensor acompanha a localização e estado do mouse  e monitoriza a manipulação dos objetos gráficos associados ao sensor, gerando eventos de acordo com esta manipulação. É essencial para permitir o controle da evolução da cena pelo utilizador.

Detecta a interação do mouse com as geometrias. Quando o mouse é movido sobre o objeto, um evento isOver gera sinais TRUE, e quando o mouse é movido para fora da superfície do objeto o evento isOver gera sinais de FALSE. Se algum dos botões é clicado enquanto isOver for TRUE, então isActive gera sinais TRUE. Quando o botão for solto, isActive gera sinais FALSE. O eventOut touchTime é enviado quando um botão é clicado e solto sobre a geometria. Se o cursor é removido antes do botão ser solto, o evento não será enviado. Sua sintaxe é:

TouchSensor {
......enabled TRUE
......hitNormal_changed
......hitPoint_changed
......hitTexCoord_changed
......isActive
......isOver
......touchTime
}

Um exemplo de interação: quando pressionamos um botão do mouse sobre os nós associados a um TouchSensor, este gera o evento touchTime - o instante em que o botão foi pressionado. Outro exemplo: se passarmos com o mouse sobre os mesmos nós, o sensor gera um evento isOver que indica que o rato se encontra sobre os objetos.

Exemplo 58: - Uma esfera que passa a ser iluminada por uma luz vermelha (inicialmente apagada) quando o mouse passa por cima da esfera.

Shape {
......appearance Appearance {
............material Material {
..................diffuseColor 1 1 1
............}
......}
......geometry Sphere {
............radius 2.0
......}
}
DEF PL PointLight {
......color 1 0 1
......on FALSE
......location 7 0 7
}
DEF TS TouchSensor {
......enabled TRUE
}
ROUTE TS.isOver TO PL.set_on

 

Exemplo 59: - Animação com o ColorInterpolator

Group {
     children [
          Shape {
               appearance Appearance {
                    material DEF theColor Material {
                         diffuseColor 1 0 0
                    } # end material
               } # end appearance
               geometry Sphere {
                    radius 2
               } # end geometry
          } # end shape
          DEF toucher TouchSensor {
               enabled TRUE
          } # end toucher
     ] # end children
} # end group

DEF timer TimeSensor {
     loop FALSE
     cycleInterval 1
}

DEF colorChanger ColorInterpolator {
     key[     0     .25     .50     0.75     1 ] # end key
     keyValue [
          1 0 0
          1 0 0
          0 0 1
          0 0 1
          1 0 0
     ] # end keyValue
} # end colorChanger

ROUTE toucher.touchTime TO timer.startTime
ROUTE timer.fraction_changed TO colorChanger.set_fraction
ROUTE colorChanger.value_changed TO theColor.set_diffuseColor

 

Exemplo 60: - Animação com o OrientationInterpolator acionadas por sensor de toque ( TouchSensor )

#VRML V2.0 utf8
# The VRML 2.0 Sourcebook
# Copyright (c) 1997
# Andrea L. Ames, David R. Nadeau, and John L. Moreland
# A cube that spins when the viewer's cursor moves over it

Group{
     children [
          # Cubo que gira quando o usuário clica sobre ele
          DEF Cube Transform {
               children Shape {
                    appearance Appearance {
                         material Material { }
                    }
                    geometry Box { }
               }
          },

          # Sensor, detecta quando o usuário clica em um objeto
          DEF Touch TouchSensor { },

          # relógio para controlar a animação
          DEF Clock TimeSensor {
               enabled FALSE
               cycleInterval 4.0
               loop TRUE
          },

          # Caminho da animação (movimento)
          DEF CubePath OrientationInterpolator {
               key [0.0, 0.50, 1.0]
               keyValue [
                    0.0 1.0 0.0 0.0,
                    0.0 1.0 0.0 3.14,
                    0.0 1.0 0.0 6.28
               ]
          }
     ]
}

# Rotas
ROUTE Touch.isOver TO Clock.set_enabled
ROUTE Clock.fraction_changed TO CubePath.set_fraction
ROUTE CubePath.value_changed TO Cube.set_rotation