O que será visto nesta aula:
IV - Group Node
V - Transformações
Este nodo é um grouping node (vide item I.4.2) que nos possibilita agrupar geometrias, a fim de criar um novo objeto que seja constituído pela combinação de outros objetos.
Group {
eventIn MFNode addChildren
eventIn MFNode removeChildren
exposedField MFNode children []
field SFVec3f bboxCenter
0 0 0
field SFVec3f bboxSize
-1 -1 -1
}
Campo | Descrição |
bboxCenter | centro da área retangular hipotética que circunda os nodos especificados em children |
bboxSize | dimensões em x, y e z da área retangular hipotética que circunda os objetos especificados em children no nodo Group |
children | nodos a serem agrupados |
Eventos | eventIn MFNode |
addChildren | adiciona o nodo especificado na lista de objetos em children do nodo Group. Caso este nodo já exista, a nova inclusão é ignorada |
removeChildren | remove o nodo especificado da lista de objetos em children do nodo Group. Caso este nodo não exista, a remoção é ignorada. |
Exemplo IV - Group Node - Formação de uma seta bidirecional, usando-se dois cones e um cilindro
#VRML V2.0 utf8
Group {
children [
DEF Red_Cone
Shape {
geometry Cone { bottomRadius 1.5
height 2
side TRUE
bottom TRUE
}
appearance Appearance {
material Material {
diffuseColor 1 0 0
}
}
}
Transform {
translation 0 -1.5 0
children [
Shape
{
appearance Appearance {
material Material {
diffuseColor 1 0 0
shininess .5
}
}
geometry Cylinder {
radius 1
height 2
side TRUE
top TRUE
bottom TRUE
}
}
]
}
Transform {
rotation 1 0 0 3.14
translation 0 -3.5 0
children [
USE Red_Cone
]
}
]
}
Maiores informações são encontradas em Group
no Tutorial.
V.1 - Transform Node
Campo | Descrição |
bboxCenter | centro da "caixa virtual" que envolve os nodos no campo children do nodo Transform |
bboxSize | dimensões em x, y e z da "caixa virtual" que envolve os nodos children de Transform. Por default, essa "caixa" é inexistente |
translation | especifica um vetor de translação |
rotation | especifica uma rotação, definindo um eixo e um ângulo em radianos |
scale | especifica um escala, a qual, não necessariamente, precisa ser uniforme |
scaleOrientation | especifica um orientação rotacional para a operação de escala |
center | define a origem para as operações de escala e rotação |
children | nodos que são afetados pelas transformações definidas em Transform |
Evento |
Descrição
eventIn MFNode |
addChildren | adiciona um nodo ao campo children de Transform. Caso ele já exista, o acréscimo é ignorado. |
removeChildren | remove um nodo do campo children de Transform. Caso ele não exista, a operação de remoção é ignorada. |
O exemplo seguinte ilustra os três casos: no centro da cena, está o cone original. São aplicadas as três operações combinadas, da mais interna para a mais externa, ou seja, o cone é transladado para a posição (2 2 0), rotacionado 3 radianos em torno do eixo z e, finalmente, suas dimensões são alteradas nas três direções não uniformemente, resultando no cone visto mais acima na cena.
Exemplo V.1: Nodo Transform - Translação, Escala e Rotação
#VRML V2.0 utf8
# Aparece o cone original:
DEF Cone_Vermelho Shape {
geometry Cone {}
# Cone
appearance Appearance {
material Material {
diffuseColor 1 0 0 # Vermelho
}
}
}
# As três operações
são aplicadas sobre o cone original, resultando no segundo. A sequência
de execução será translação,
rotação
e escala (operação definida no nodo
mais interno para o mais externo):
Transform {
scale
0.7 1.5 0.6
children USE Cone_Vermelho
children Transform {
rotation
0 0 1 3
children USE Cone_Vermelho
children Transform
{
translation
2 2 0
children USE Cone_Vermelho
}
}
}
Maiores informações em Transform
Node no Tutorial.
Deslocamento dos objetos nas direções x, y e z. Não
existe a necessidade de se preocupar com unidades de medida, desde que
se mantenha consistência em toda a cena, sugerindo-se, então,
utilizar a unidade padrão de medida (basta não especificar
nenhuma unidade).
Vide exemplo V.1 .
Rotaciona-se o objeto especificado no campo children em torno de
um eixo determinado e de um ângulo também determinado. O campo
associado à rotação ( vide exemplo III.1.2) consiste
de quatro números: os três primeiros referem-se à localização
espacial de um eixo de rotação e o quarto número,
é o ângulo de rotação em torno do tal eixo.
Vide exemplo V.1 .
Embora não seja obrigatório, sugere-se que se forneça
um vetor unitário nos três primeiros números, muito
embora a definição:
rotation 0 0 30 3 # Sugere-se: rotation 0 0 1 3
não seja errada.
No exemplo V.1, faz-se uma rotação
de 3 radianos (no sentido anti-horário definido pelo valor
positivo
do ângulo) em torno do eixo z.
Quando se deseja rotacionar em torno de mais de um eixo, deve-se utilizar
uma combinação de transformações ( como feita
no exemplo) ou verificar em torno de que ponto ter-se-ia o mesmo resultado.
As dimensões do objeto definido em children são diminuídas
ou aumentadas. O campo scale apresenta três números:
o tamanho da escala em cada uma das direções x, y
e z.
Uma escala unitária, em qualquer direção, implica
na não alteração de tamanho naquela direção
e, portanto, uma escala igual a (1 1 1) não implicaria em nenhuma
modificação nas dimensões do objeto. Um valor 0 (zero)
em qualquer direção não é aconselhável,
fazendo com que o browser envie um aviso solicitando que todos os valores
do campo scale sejam maiores que 0.0 .
Vide exemplo V.1 .
V.2 - Combinação
de Transformações
A ordem em que é realizada uma série de transformações
é importantíssima, pois, por exemplo, uma rotação
seguida de uma translação, não geraria o mesmo resultado
se as operações fossem feitas na ordem inversa (translação
seguida de rotação). Além disso, uma transformação
definida num "nodo pai" (um parent node) também é
aplicada aos "nodos filhos" (este tema é discutido na literatura
como "nested transformations").
Chama-se a atenção para o fato de que, quando especificadas
no mesmo nível dentro de um Transform Node ( vide exemplo
V.2), a ordem em que as operações é feita será
sempre escala, rotação e translação,
independentemente da ordem em que os campos associados a cada uma delas
foram escritos no código do programa. Caso se queira que as transformações
sejam feitas numa ordem distinta, deve-se realizar o que chamam de "multiple
nested transformations" que como citado anteriormente e ilustrado no
exemplo
V.1, corresponde a uma série de nodos Transform definidos
um dentro do outro. A ordem de execução é sempre do
nodo Transform mais interno para o mais externo, ou em outras palavras,
primeiramente é executada a operação definida no nodo
filho mais interno, depois a definida no pai deste e assim sucessivamente,
retrocedendo na "árvore genealógica".
Exemplo V.2: Combinação de Transformações
#VRML V2.0 utf8
# Aparece o cone original:
DEF Cone_Vermelho Shape {
geometry Cone {}
# Cone
appearance Appearance {
material Material {
diffuseColor 1 0 0 # Vermelho
}
}
}
# As operações
são definidas no mesmo nível.
# Apesar da
ordem em que aparecem escritas, a ordem de execução será:
escala, rotação e translação
Transform {
rotation 0 0 1 3
scale 0.7 1.5 0.6
translation 2 2 0
children
USE Cone_Vermelho
}
VI - Nodo Viewpoint - Ponto-de-Vista
Este nodo especifica uma posição ( position) e orientação (orientation) segundo as quais o observador vê a cena: equivale a definir um ângulo de visão segundo o qual o usuário enxerga a cena.
Viewpoint {
eventIn
SFBool set_bind
exposedField SFFloat fieldOfView
0.785398
exposedField SFBool jump
TRUE
exposedField SFRotation orientation
0 0 1 0
exposedField SFVec3f position
0 0 10
field
SFString description ""
eventOut
SFTime bindTime
eventOut
SFBool isBound
}
Pode-se definir um "campo de visão" (field-of-view) para se especificar o quanto ou que porção da cena será visível. O valor default de position para Viewpoint é (0 0 10) que é adequado para pequenos objetos localizados na origem.
NOTA: O campo field-of-view é especificado
em radianos, sendo que 1 radiano equivale a 57 graus aproximadamente e
2pi radianos a 360 graus. Portanto, seu valor default em graus equivale
a: 0.785398 rad = 45 graus aproximadamente.
Os valores de posição e orientação são
alterados por transformações locais e também por aquelas
definidas nos nodos ancestrais ( parent nodes).
O campo description permite atribuir um nome à cena de acordo
com o ponto-de-vista em que ela é visualizada. Sendo assim, pode-se
definir previamente um conjunto de "pontos-de-vista de câmera", auxiliando
o observador a enxergar a cena sob vários ângulos, dispensando
a necessidade de "navegar manualmente" por ela. Maiores detalhes de como
isso pode ser feito estão na referência
[2].
Informações adicionais em Viewpoint
Node no Tutorial.
VII.1 - Introdução
Existem três tipos de nodos luz, ou light source nodes, em
VRML:
DirectionalLight,
PointLight
e SpotLight
que
serão vistos mais adiante.
A luz, em VRML, não é exatamente como no mundo real, onde
há sempre um objeto emissor de luz que também pode ser visto.
Em VRML, não necessariamente, é explicitada a fonte luminosa,
ou seja, o nodo luz apenas descreve como parte do mundo virtual é
iluminada, não sendo obrigatoriamente uma fonte visível.
Caso se queira por na cena um objeto como fonte de luz, deve-se criar uma
geometria com tal formato (um bulbo de lâmpada por exemplo) e posicioná-lo
no local adequado, em geral, na mesma posição do nodo luz.
Pode-se ainda, associar um campo emissiveColor à geometria
(como parte do nodo Appearance a ela associado) a fim de criar a
impressão de que o objeto-fonte está brilhando.
Os campos intensity, color, ambientIntensity e on
são comuns aos três tipos de nodo luz.
Campo | Descrição |
intensity | especifica o quão brilhante é o facho de luz direcionado aos objetos |
color | especifica a coloração das luzes (valor em RGB) emitidas diretamente e também difusamente pelo ambiente |
ambientIntensity | define a intensidade de luz que ilumina os objetos devido a reflexões difusas por todo o ambiente. Seu valor varia de 0.0 (nenhuma luz emitida) a 1.0 (máxima intensidade luminosa) |
on | indica se a fonte de luz está ligada ou não. Quando desligada (on = FALSE), este nodo não contribui para a iluminação da cena. Seu valor pode ser alterado através do envio de um evento. |
DirectionalLight {
exposedField SFFloat ambientIntensity
0
exposedField SFColor color
1 1 1
exposedField SFVec3f direction
0 0 -1
exposedField SFFloat intensity
1
exposedField SFBool on
TRUE
}
Este nodo define uma fonte de luz que ilumina a cena com raios paralelos,
segundo uma certa direção. Os campos intensity, color,
ambientIntensity
e on são comuns aos três tipos de nodo luz e estão
descritos no item VII.1 anterior.
O campo direction estabelece a direção dos raios luminosos
que emanam da fonte de luz, dentro do sistema local de coordenadas. De
modo geral, o nodo DirectionalLight somente ilumina os nodos que
estão presentes no campo children do nodo que é "seu
pai" ( parent node). Porém, há browsers que, em certos
sistemas, acabam por iluminar todos os objetos da cena.
PointLight {
exposedField SFFloat ambientIntensity
0
exposedField SFVec3f attenuation
1 0 0
exposedField SFColor color
1 1 1
exposedField SFFloat intensity
1
exposedField SFVec3f location
0 0 0
exposedField SFBool on
TRUE
exposedField SFFloat radius
100
}
Este nodo define uma fonte pontual luminosa que emite luz para todas as
direções igualmente (tal qual uma lâmpada). O nodo
PointLight
é especificado dentro do sistema local de coordenadas e é
afetado pelas transformações definidas em "seus nodos ancestrais"
(ancestors transformations). Além dos quatro campos (intensity,
color,
ambientIntensity
e on) comuns a todos os "nodos luz" têm-se:
Campo | Descrição |
location | posição da fonte luminosa no sistema local de coordenadas |
radius | indica a distância máxima que um objeto pode estar da fonte, mas ainda ser iluminado por ela |
attenuation | efeito realístico que pode ser atribuído à iluminação da cena, indicando que, à medida em que os objetos se afastam da fonte, a luz que os ilumina fica enfraquecida. Três números compõem esse campo: o primeiro para atenuação constante, o segundo linear com a distância e o terceiro quadrática (com o quadrado da distância). |
OBS.: A adição de uma fonte luminosa, em
geral, leva a uma queda na performance do browser. Há browsers,
no entanto, que não suportam mais que dois nodos PointLight numa
mesma cena.
SpotLight {
exposedField SFFloat ambientIntensity
0
exposedField SFVec3f attenuation
1 0 0
exposedField SFFloat beamWidth
1.570796
exposedField SFColor color
1 1 1
exposedField SFFloat cutOffAngle
0.785398
exposedField SFVec3f direction
0 0 -1
exposedField SFFloat intensity
1
exposedField SFVec3f location
0 0 0
exposedField SFBool on
TRUE
exposedField SFFloat radius
100
}
Campos | Descrição |
location | posição da fonte luminosa no sistema local de coordenadas |
direction | eixos do cone de luz |
beamWidth | ângulo em radianos subentendido pelo cone principal de luz. No seu interior, os objetos são iluminados igualmente e com máxima intensidade e, fora dele, a intensidade luminosa vai decrescendo gradativamente |
cutOffAngle | ângulo além do qual nada é iluminado na cena |
radius | assumindo que o objeto está sendo abrangido pelo cone de luz, indica a distância máxima que um objeto pode estar da fonte para ainda ser iluminado por ela |
attenuation | efeito realístico que pode ser atribuído à iluminação da cena, indicando que, à medida em que os objetos se afastam da fonte, a luz que os ilumina fica enfraquecida. Três números compõem esse campo: o primeiro para atenuação constante, o segundo linear com a distância e o terceiro quadrática (com o quadrado da distância). |
Fig.VII.1-1: SpotLight
Color {
exposedField MFColor color
[]
}
Campo | Descrição |
color | valor RGB (do Inglês: Red, Green, Blue) a ser aplicado a cada face ou vértice de um objeto. |
Maiores informações em Color
Node no Tutorial.
IX.1 - Conceito
Uma textura, ou texture map, é uma imagem bidimensional que
é mapeada sobre uma superfície, cobrindo-a parcial ou totalmente.
Os nodos Texture especificam não só a imagem em si,
que servirá de textura para um objeto qualquer, mas também
como ela encobrirá a superfície do objeto.
Os nodos texture são três: ImageTexture,
MovieTexture
e PixelTexture
e cada um deles está descrito com maiores detalhes no Tutorial.
Ressalte-se ainda que o nodo Texture tem precedência sobre
o nodo Color, de modo que, se ambos forem especificados para uma
mesma geometria, o nodo Color é ignorado.
TextureCoordinate {
exposedField MFVec2f point
[]
}
Campo | Descrição |
point | coordenadas da textura na forma de pares (s t) a serem mapeados para os vértices de IndexedFaceSet ou ElevationGrid |
Fig. IX.2-1: Texture Coordinates
OBS.: O nodo TextureCoordinate aparece no campo texCoord dos nodos ElevationGrid e IndexedFaceSet.
Maiores informações, consulte TextureCoordinate
no Tutorial.
Este nodo define uma transformação bidimensional que é
aplicada às "coordenadas da textura". Ele somente aparece definido
no campo textureTransform do nodo Appearance e afeta o modo
segundo o qual a textura é mapeada sobre a superfície da
geometria a ele associada. Traduz-se como uma maneira de tornar o mapeamento
mais realístico, acompanhando as irregularidades (como ondulações)
da superfície em questão.
A ordem em que as operações são executadas é:
escala, rotação e translação.
TextureTransform
{
exposedField SFVec2f center
0 0
exposedField SFFloat rotation
0
exposedField SFVec2f scale
1 1
exposedField SFVec2f translation
0 0
}
Campos | Descrição |
translation | especifica uma translação a ser aplicada sobre a textura |
center | especifica um ponto que servirá de referência central para as operações de escala e rotação |
scale | especifica a escala, em relação ao center do objeto; pode ser não uniforme, isto é, dimensões diferentes para cada uma das direções x, y e z |
rotation | especifica a rotação a ser aplicada, em relação ao center do objeto, como definido em center |
2. Crie um exercício para mostrar que a ordem entre as transformações modifica o resultado final.
3. Repita o exercício 1 incluindo agora fontes de luz dos 3 tipos apresentados. Trabalhe com os diferentes parâmetros.
4. Obtenha uma imagem como a apresentada aqui.
Descreva-a (programa VRML comentado).
Obs.: Clicando sobre a figura animada com o botão
direito do mouse, você poderá recomeçar a animação
("Reload") ou interrompê-la ("Stop").
Dica: Use o nodo IndexedFaceSet
para gerar a figura e, então, o TextureCoordinate para mapear
a textura nos vértices da figura.