8. Vértices

 Objetivo: Editar vértices de uma malha em tempo-real
 Nível: Intermediário
 Arquivos: vertex.bb / plane.3ds

 

Movement

Se você já leu anteriormente a seção sobre malhas então você já saberá muito do que faremos neste tutorial. Se não leu, saia daqui e vá ler!

Vamos recapitular:

Cada MALHA (um objeto 3D), é composto de SUPERFÍCIES.

Cada SUPERFÍCIE tem um BRUSH.

A cada BRUSH pode ser atribuídas 8 texturas diferentes.
(que podem ser sobrepostas para criar novos efeitos)

Cada SUPERFÍCIE é composta de TRIÂNGULOS.

Cada TRIÂNGULO é composto de 3 VÉRTICES.

Assim, armado com essa informação você já deve saber como é composto um objeto 3D. Vamos pegar um quadrado plano como exemplo. Ele é composto de 4 vértices e 2 triângulos. O que nós estamos planejando fazer é pegar 2 desses vértices e mudar suas coordenadas.

De fato, como mencionado em "Introdução a Malhas", nós podemos até mesmo mudar a cor dos vértices em tempo-real. Execute o exemplo. O que você vê é um objeto quadrado (que está girando lentamente no eixo Z), sendo deformado em 2 cantos - enquanto os vértices mudam de cor.

É um efeito muito fácil para criar, eu não vou entrar em muitos detalhes sobre como/por que o programa funciona, mas aqui está um rápido informe se você estiver interessado:

Nós definimos a variável 'COUNTER' (contador) que faz exatamente isso... ser usada como um contador. Toda vez que o programa passa pelo loop principal, o valor é incrementado. O valor do contador corresponde a que direção nós deveríamos puxar os vértices. Se o contador alcança 1000, então mudamos a cor de cada vértice para uma seleção aleatória, antes de resetar o valor do contador.

Demos uma olhada:

   
  Graphics3D 800,600

   SetBuffer BackBuffer()

   camera=CreateCamera()
   CameraViewport camera,0,0,800,600

   light=CreateLight()

   plane=LoadMesh("plane.3ds")
   PositionEntity plane,0,0,25
   EntityFX plane,2

   surface=GetSurface(plane,CountSurfaces(plane))

   VertexColor surface,0,255,0,0
   VertexColor surface,1,0,255,0
   VertexColor surface,2,0,0,255
   VertexColor surface,3,255,0,255

   While Not KeyHit(1)

   TurnEntity plane,0,0,.3

   counter=counter+1

   If counter<500 Then 
   x1#=-.01
   y1#=-.01
   x2#=+.01
   EndIf

   If counter>499 Then
   x1#=+.01
   y1#=+.01
   x2#=-.01
   EndIf

   xx#=VertexX(surface,0)
   yy#=VertexY(surface,0)
   zz#=VertexZ(surface,0)

   VertexCoords surface,0,xx+x1,yy+y1,zz

   xx#=VertexX(surface,2)
   yy#=VertexY(surface,2)
   zz#=VertexZ(surface,2)

   VertexCoords surface,2,xx+x2,yy+y1,zz

   If counter=1000 Then
   counter=0
   VertexColor surface,0,Rnd#(0,255),Rnd#(0,255),Rnd#(0,255)
   VertexColor surface,1,Rnd#(0,255),Rnd#(0,255),Rnd#(0,255)
   VertexColor surface,2,Rnd#(0,255),Rnd#(0,255),Rnd#(0,255)
   VertexColor surface,3,Rnd#(0,255),Rnd#(0,255),Rnd#(0,255)
   EndIf

   UpdateWorld
   RenderWorld

   Text 350,500,"Controle de Vértices"

   Flip

   Wend
   End

 

Então como nós chegamos aos vértices do objeto?

Bem, nós carregamos o objeto com o comando LoadMesh, o objeto que nós estamos carregando é chamado Plane.3ds
.

EntityFX plane,2

Aqui está um comando que nós não vimos antes! Este comando realmente é mais um selecionador de efeitos que qualquer outra coisa. Mas definindo valores nós podemos ter acesso à entidade de diferentes modos. O valor '2' serve para habilitar a coloração de vértices em toda a entidade, e por padrão é desativado.

Estes são os efeitos possíveis:

0 = Nenhum efeito (padrão)
1 = Iluminação total
2 = Usar vértices coloridos
4 = "Flatshading"
8 = Desativar névoa
16 = Desativar "backface culling"

Há outro comando bem parecido com o EntitiyFX chamado BrushFX. Ele usa os mesmos valores, mas em vez de mudar a entidade inteira ele afeta um único brush. (Se lembre que uma malha tem superfícies, com brushes aplicados a elas)

surface=GetSurface(plane,CountSurfaces(plane))

Para chegar aos vértices nós temos primeiro que desbloqueá-los. Nós fazemos isto criando uma variável que guarda o endereço de memória das superfícies da malha.

Se acalme! Nós não temos que sujar nossas mãos com cálculos complicados. Ao invés disso nós usamos o comando GetSurface, que primeiro pede o nome da malha, e depois a quantidade de superfícies que ela tem. Como você pode ver eu usei o comando CountSurfaces para fazer isto para mim
.

VertexColor surface,0,255,0,0
VertexColor surface,1,0,255,0
VertexColor surface,2,0,0,255
VertexColor surface,3,255,0,255

Antes de entrar no loop principal, eu defini a cada vértice com uma cor diferente. Isto nos dá um efeito de arco-íris agradável! Como você pode ver nós passamos a variável 'surface' para o comando VertexColor, como também o número do vértice (0-3, uma vez que nosso objeto só tem 4 pontos), seguido pelos valores de cor vermelho, verde e azul. (Deve estar entre 0 (Escuro) e 255 (Claro))

xx#=VertexX(surface,0)
yy#=VertexY(surface,0)
zz#=VertexZ(surface,0)

Como eu quero que as coordenadas da malha mudem todo o tempo, eu não posso fixar isto com um valor que não muda. Em toda atualização eu tenho que adquirir as coordenadas atuais e ligeiramente as alterar (somando um valor às coordenadas X e Y).

Eu faço isto adquirindo os vértices X,Y e Z atuais - usando os vários comandos que retornam as coordenadas dos vértices!

VertexCoords surface,0,xx+x1,yy+y1,zz

Como você provavelmente percebeu, esta é a instrução principal para mudar as posições de vértice atuais. Precisa ser chamado com a variável da superfície, seguido pelos novos valores X, Y e Z.


É isso aí!

Mas por que você iria querer mudar as coordenadas?

Todos os jogos alteram seus objetos, é só o caso de descobrir como e onde eles fazem isso. Imagine que você projetou um simulador de direção. Não seria agradável quando você chocasse o carro que o dano aparecesse? Talvez amassar a lataria... ou quebrar um vidro.

Como certos jogos de carros de sucesso, eles usam exatamente o mesmo método. Você tem que implementar isso no B3D - Você quer isto... está lá, agora vá e use sabiamente
!

Mais tutoriais a caminho..
Tutoriais escritos por by Paul Gerfen
(c) 2001 GameCodingUK