2. Movimento e Rotação

 Objetivo: Mover um objeto no espaço 3D
 Nível: Iniciante
 Arquivos: movement.bb / rocket.3ds

 

Movement

Vamos começar a fazer coisas se moverem! Neste tutorial nós estaremos carregando um objeto que eu fiz em 3D Studio. Garanto que ele não é maravilhoso e se parece mais com uma vela que um foguete, mas irá servir.

Vamos dar uma olhada no código-fonte. Sinta-se livre para rodá-lo!

NOTA: Você precisará ter o objeto ROCKET.3DS no mesmo diretório do arquivo fonte para o Blitz encontrá-lo.

Você pode mover o foguete com a seta PARA CIMA, e girá-lo com ESQUERDA e DIREITA
.

   
  Graphics3D 800,600

  SetBuffer BackBuffer()

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

  light=CreateLight()

  rocket=LoadMesh( "rocket.3ds" )
  PositionEntity rocket,0,0,7

  While Not KeyHit(1)

      If KeyDown(200) Then
          MoveEntity rocket,0,0.05,0
      EndIf

      If KeyDown(203) Then
          TurnEntity rocket,0,0,1.0
      EndIf

      If KeyDown(205) Then
          TurnEntity rocket,0,0,-1.0
      EndIf

  UpdateWorld
  RenderWorld

  Text 320,500,"Movimento e Rotação"

  Flip

  Wend
  End

 

Eu não explicarei todas as linhas de código, só os comandos novos que nós ainda não usamos. O primeiro é:

rocket=LoadMesh("rocket.3ds")

Como você provavelmente pode adivinhar, esta linha de código carregará um modelo 3D chamado ROCKET.3DS em uma variável chamada 'rocket'.

O que é essa variável? É exatamente o mesmo tipo de rótulo que nós usamos em Blitz para inicializar sprites. (Ele guarda o endereço de memória onde os dados são armazenados) Neste caso ela aponta para o local onde o modelo é armazenado.

If KeyDown(200) Then
MoveEntity rocket,0,0.05,0
EndIf

Estas 3 linhas nos falam que se você está apertando PARA CIMA, o objeto 'ROCKET' se move no eixo Y 0.05 unidades acima.

Vamos dar uma olhada mais profunda nisso. Se lembre que meu foguete está apontando para cima - assim para começar eu quero que meu foguete viaje para cima - por isso eu estou aumentando a coordenada Y. (se lembre que em 3D um Y positivo quer dizer para cima - não abaixo como em sistemas de coordenada normais, como coordenadas de sprites no Blitz2D)

Se meu foguete fosse um carro que foi projetado para estar voltado para a direita, então eu quereria que meu carro viajasse à direita da tela - assim eu estaria aumentando a coordenada X. É muito importante observar isso no começo de seu programa, ou seu objeto poderia começar se movendo para a direção errada
.

If KeyDown(203) Then
TurnEntity rocket,0,0,1.0
EndIf

If KeyDown(205) Then
TurnEntity rocket,0,0,-1.0
EndIf

Deveria ser bastante óbvio a você que estas linhas controlam a rotação de nosso foguete. Se você aperta a seta ESQUERDA - gira o foguete 1.0 unidade (no sentido horário), ao passo que apertando a seta DIREITA resulta em girar -1.0 (anti-horário).

Assim como o objeto ainda move para frente embora nós já não estejamos apontando para cima? .. bem.. você tem que agradecer Mr Sibly por nos dar o comando TurnEntity! Perceba que quando giramos o objeto, o eixo move junto. Se nós girarmos o objeto 90 graus, o eixo de Y está apontando agora onde o eixo de X deveria estar. Não preocupe em 'por que' ou 'como'.. só seja grato você não tem que trabalhar com sórdidos cálculos para fazer isto.

Caso você esteja desejando saber, você pode girar o objeto sem que o eixo se mova usando o comando RotateEntity. Isto seria usado principalmente para colocação de objetos em seu mundo - por exemplo, se eu projetasse o foguete em seu lado. Eu o giraria primeiramente até ele estar voltado para cima com o comando RotateEntity - então eu poderia usar o TurnEntity para movê-lo.

O único modo de entender totalmente este comando, (que provavelmente será seu comando mais usado) é experimentar. Tente fazer o foguete girar em outras direções!!

Se lembre que este é o formato que você usa
:

TurnEntity [objeto],[quantidade a girar no eixo X],[quantidade a girar no eixo Y],[quantidade a girar no eixo Z]

NOTA: O Blitz3D também contém um comando para escalar um objeto, (veja o manual para mais onformações sobre o comando ScaleEntity) - se, por exemplo, nós projetássemos o objeto muito pequeno nós poderíamos aumentá-lo em tempo real, ou encolhê-lo se estivesse muito grande. Se você escolher usar uma multidão de diferentes programas 3D para projetar seus objetos, então você precisará usar muito este comando. O 3D Studio por exemplo, gosta de escalar seu objeto maior que outros programas.

Tutorial 3 - Movimento de Câmera