Introdução à VRML 2.0
(Profa. Isabel Harb Manssour)

[Anterior]  [Próxima]  [Principal]

 

5. Alterando o Aspecto de Shapes

Os shapes descritos até agora podem ser combinados e alterados para formar cenas mais complexas, como por exemplo a criação de uma cidade. Assim, neste capítulo é apresentado o nó de agrupamento (group node) Transform, que cria um sistema de coordenadas local para os nós filhos. A ordem de uma série de transformações definidas dentro de um mesmo nó Transform é fixa: mudança de escala em torno de um ponto central, rotação em torno de um ponto central, e translação relativa ao sistema de coordenadas pai. Para mudar a ordem das transformações, é necessário aninhar nós Transform. Nas próximas seções estas transformações são detalhadamente descritas.

5.1. Posicionando Shapes

Shapes podem ser posicionados em qualquer lugar do "mundo" VRML usando o nó de agrupamento Transform e seu campo translation. Como já comentado, o "mundo" VRML é constituído por um sistema de coordenadas 3D. Para exemplificar, uma coordenada (3.0, 2.0, 5.0) está 3.0 unidades ao longo do eixo X, 2.0 unidades ao longo do eixo Y e 5.0 unidades ao longo do eixo Z. O nó Shape, assim como o Text, é construído na origem deste sistema de referência.

Em VRML é possível criar qualquer número de sistemas de coordenadas, sendo que cada um é posicionado, ou transladado, em relação à origem de outro sistema de coordenadas. Quando um sistema de coordenadas é relativo a outro, diz-se que o novo sistema de coordenadas é um "filho" (child coordinate system) que é aninhado (nested) dentro do sistema de coordenadas "pai" (parent coordinate system), que, por sua vez, também pode estar aninhado em outro sistema de coordenadas, e assim por diante. O pai mais externo é chamado de raiz (root coordinate system).

Nos exemplos apresentados até aqui os shapes eram centralizados na origem do sistema de coordenadas raiz. O nó transform cria novos sistemas de coordenadas relativos ao sistema raiz ou a qualquer outro. O sistema raiz, a partir do qual os outros sistemas dependem direta ou indiretamente, e ao qual o "mundo" VRML está associado, é freqüentemente chamado de sistema de coordenadas do mundo (world coordinate system). Todos os sistemas de coordenadas, incluindo shapes que são construídos nestes sistemas de coordenadas, são chamados de cena gráfica. Para ilustrar, a figura 5.1 mostra um sistema de coordenadas do universo representado pelos eixos X, Y e Z, e um sistema de coordenadas filho transladado -3.0 unidades ao longo do eixo X, 2.0 unidades ao longo do eixo Y e 2.0 unidades ao longo do eixo Z.

Image51.jpg (5898 bytes)

Figura 5.1 – Sistema de coordenadas do mundo e um filho

Cada vez que se cria um novo sistema de coordenadas com o nó Transform, especifica-se sua posição, ou translação, relativa ao sistema de coordenadas pai. A distância de translação é dada em unidades VRML nas direções de X, Y e Z e determina a localização de qualquer shape criado neste novo sistema de coordenadas. Torna-se importante salientar que, por default, o observador inicialmente está na posição (0, 0, 10) do sistema de coordenadas do mundo, olhando na direção do eixo Z negativo.

O nó Transform é um nó de agrupamento semelhante a Group, que cria um novo sistema de coordenadas relativo (transladado) ao sistema de coordenadas pai. Ele contém um lista de nós child, que podem ser nós Shape, Group ou Transform. Shapes criados como children do nó Transform são construídos em relação a nova origem do sistema de coordenadas. A sintaxe do nó Transform é a seguinte:

Transform{
	children	[ ]		# MFNode
	translation	0.0 0.0 0.0	# SFVec3f
	rotation	0.0 0.0 1.0 0.0	# SFRotation
	scale		1.0 1.0 1.0	# SFVec3f
	scaleOrientation 0.0 0.0 1.0 0.0	# SFRotation
	bboxCenter	0.0 0.0 0.0	# SFVec3f
	bboxSize	-1.0 -1.0 -1.0	# SFVec3f
	center		0.0 0.0 0.0	# SFVec3f
	addChildren			# MFNode
	removeChildren			# MFNode
}

O valor do campo children especifica uma lista de nós child que serão incluídos no grupo, tipicamente Shape, Group ou Transform. O valor default para este campo é uma lista vazia. Os valores de translation especificam as distâncias nas direções X, Y e Z, respectivamente, entre a origem do sistema de coordenadas pai e do filho. O valor default 0.0 não acarreta alteração de posição. Os outros campos deste nó serão descritos posteriormente. Um exemplo da utilização deste nó é apresentado abaixo e ilustrado na figura 5.2.

#VRML V2.0 utf8
# Exemplo de utilização do nó Transform

Transform {
    translation 2.0 1.0 -2.0
    children [
        Shape {
            appearance Appearance {
                material Material { }
            }
            geometry Cylinder { }
        }
    ]
}

Figura 5.2 – Translação de um cilindro

5.2. Rotação de Shapes

Através dos campos rotation e center do nó Transform, torna-se possível rotacionar shapes e grupos de shapes sobre a origem do sistema de coordenadas ou sobre um ponto central especificado. Desta forma é possível, por exemplo, posicionar um cone com a ponta virada para baixo para formar um funil, e girar um cilindro para fazer a roda de um carro.

Um eixo de rotação é uma linha imaginária sobre a qual um sistema de coordenadas é rotacionado, que pode apontar para qualquer direção. Por exemplo, o eixo de rotação usado para girar o pneu de um carro aponta horizontalmente para fora do centro do pneu. Quando se rotaciona um sistema de coordenadas em VRML, está se especificando um eixo de rotação e a direção para este eixo de rotação. Para se especificar a direção para um eixo de rotação, imagine o desenho de uma linha entre duas coordenadas no espaço. Uma coordenada está sempre na origem (0.0, 0.0, 0.0) e a outra está localizada em uma outra posição. A linha imaginária desenhada entre estas duas coordenadas cria um eixo de rotação. A distância entre as duas coordenadas não faz diferença, isto é, qualquer ponto na linha imaginária é válido. Por exemplo, para definir um eixo de rotação que aponta ao longo do eixo Y, (0.0, 2.0, 0.0), (0.0, 0.357, 0.0) ou (0.0, 1.4, 0.0) são todos equivalentes.

Além de se especificar um eixo de rotação, também deve-se indicar o quanto o novo sistema de coordenadas deve ser rotacionado em torno do eixo. A quantidade de rotação é especificada como um ângulo de rotação, medido em radianos. Os ângulos de rotação podem positivos ou negativos, fornecendo a opção de se rotacionar um objeto para a esquerda ou para direita.

Para entender melhor o resultado da rotação de acordo com os valores fornecidos, utiliza-se a regra da mão direita. Neste caso, imagina-se que uma pessoa "agarrando" um eixo com a mão direita, dobrando os dedos ao redor do eixo e eixo e apontando o polegar na direção positiva do eixo. Um ângulo de rotação positivo irá rotacionar um sistema de coordenadas em torno do eixo na mesma direção dos dedos dobrados, e um ângulo de rotação negativo rotaciona na direção oposta.

Através do campo rotation do nó Transform, apresentado na seção anterior, é possível especificar um eixo de rotação e a quantidade de rotação em torno deste eixo. Os primeiros três valores especificam a coordenada 3D (X, Y e Z) usada para criar a linha imaginária que especifica o eixo de rotação. O quarto valor especifica o ângulo de rotação em radianos.

O valor para o campo center especifica a coordenada 3D em um novo sistema de coordenadas transladado sobre o qual as rotações vão ocorrer. O centro de rotação default, uma vez que os shapes são construídos na origem, é a origem. Entretanto, quando se está construindo shapes articulados, como um robô, é mais natural usar como centro de rotação a ponta de um braço ao invés do seu centro. Utilizando, então, o campo center, pode-se especificar a localização do centro de rotação. O próximo exemplo mostra a base e o braço de uma lâmpada de mesa ajustável. Ele simula a existência de uma "junta" no meio da base ao qual a parte inferior do braço está conectada (figura 5.3).

#VRML V2.0 utf8

Group{
    children [
    # Base da lâmpada
        Shape {
            appearance DEF White Appearance {
                material Material { }
            }
            geometry Cylinder {
                radius 0.1
                height 0.01
            }
        },


       # Junta da base
        Transform {
            translation 0.0 0.15 0.0
            rotation    1.0 0.0 0.0  -0.7
            center      0.0 -0.15 0.0
            children [
                # Braço
                Shape {
                    appearance USE White
                    geometry Cylinder {
                        radius 0.01
                        height 0.3
                    }
                }
            ]
        }
    ]
}

Figura 5.3 – Braço de uma lâmpada de mesa

 

5.3. Escala de Shapes

Translação, rotação e escala podem ser combinadas no mesmo nó Transform. Shapes podem ter qualquer tamanho em VRML e podem, então, ser combinados para criar novos objetos. Usando os campos scale e scaleOrientation do nó Transform, pode-se alterar a escala de shapes e grupos de shapes para qualquer tamanho. Assim, o sistema de coordenadas pode ter seu tamanho aumentado ou diminuído em relação ao sistema de coordenadas pai. Em outras palavras, o tamanho das unidades no mundo VRML é trocado e, por exemplo, as distâncias das translações posteriores são maiores ou menores dependendo do fator de escala. Shapes criados em um sistema de coordenadas onde foi aplicada uma escala, são construídos neste novo sistema de coordenadas.

A diferença de tamanho quando se aumenta ou diminui um objeto é chamada de fator de escala e corresponde a um fator de multiplicação. Por exemplo, para construir um carro com a metade de seu tamanho original, utiliza-se um fator de escala 0.5, e com o dobro do seu tamanho, utiliza-se um fator de escala 2.0. O campo scale usa três fatores de escala, um valor para escala na direção X, um para a direção Y e outro para direção Z. Para aumentar e diminuir a escala de um sistema de coordenadas sem deformá-lo, deve-se especificar o mesmo fator de escala nas direções X, Y e Z.

Como já comentado. os fatores de escala X, Y e Z do nó Transform permitem aumentar ou diminuir o tamanho do sistema de coordenadas diferentemente nas posições X, Y e Z. Entretanto, pode haver situações onde é necessário "esticar" um shape ao longo de uma posição arbitrária. Este efeito pode ser alcançado em VRML através da orientação da escala. Em outras palavras, somente a direção da escala é alterada, e o sistema de coordenadas como um todo não é orientado novamente.

Para orientar uma escala, deve-se utilizar o campo scaleOrientation e fornecer um eixo de rotação e um ângulo, como no campo rotation. A rotação da orientação da escala é aplicada ao novo sistema de coordenadas antes da escala, o que permite "esticar" o sistema de coordenadas em qualquer direção sem deixá-lo rotacionado.

Por default, o centro da escala (scale center) é a origem do sistema de coordenadas. Porém, é possível especificar-se um centro de escala em qualquer lugar do sistema de coordenadas usando o campo center. Assim, o fator de escala utilizado faz com que a escala seja relativa a este ponto ao invés da origem. Torna-se importante comentar que os valores para o campo center são também usados como centro da rotação, permitindo que se faça uma rotação e uma escala sobre o mesmo ponto ao mesmo tempo.

Os valores default para o campo scale do nó Transform são 1.0 para X, Y e Z. Fatores de escala podem ter valores positivos ou negativos. Valores entre 0.0 e 1.0 reduzem o tamanho do novo sistema de coordenadas, e valores maior do que 1.0 aumentam. Os valores do campo scaleOrientation correspondem aos valores X, Y e Z da coordenada 3D e ao ângulo em radianos, determinando assim o eixo de rotação e o ângulo.

O exemplo apresentado a seguir, e ilustrado na figura 5.4, mostra a maneira na qual os campos scale, scaleOrientation e center podem ser usados.

#VRML V2.0 utf8

Group {
    children [
    # Chão
        Shape {
            appearance DEF White Appearance {
                material Material { }
            }
            geometry Box {
                size 12.0 0.1 12.0
            }
        },

    # Árvore
        Transform {
            translation 0.0 1.0 0.0
            scale       1.0 2.0 1.0
            scaleOrientation 0.0 0.0 1.0 -0.785
            center      0.0 -1.0 0.0
            children [

            # Tronco
                Shape {
                    appearance USE White
                    geometry Cylinder {
                        radius 0.5
                        height 2.0
                    }
                },

            # Galhos
                Transform {
                    translation 0.0 3.0 0.0
                    children Shape {
                        appearance USE White
                        geometry Cone {
                            bottomRadius 2.0
                            height 4.0
                        }
                    }
                }
            ]
        }
    ]
}

Figura 5.4 – Árvore com escala ao longo do eixo diagonal usando orientação de escala

 ../Imagens/EMBAN15.GIF (1469 bytes)

../Imagens/E-MAIL.JPG (3237 bytes) Comentários, dúvidas, sugestões, envie um mail para [email protected]

../Imagens/EMBAN15.GIF (1469 bytes)


[Anterior]  [Próxima]  [Principal]

Última alteração em 27 de julho de 2000.