segunda-feira, 5 de outubro de 2015

Operações com Vetores

Existem diversas operações matemáticas que podem ser feitas com vetores. A compreensão dessas operações básicas é fundamental para a manipulação de objetos no espaço 3D.  

  • Adição de vetores:

A soma entre dois vetores é feita somando cada um dos seus elementos.

Exemplo: 

V1 = ( 5, 0, 9 ) e V2 = ( 4, 0, 2 )
V1 + V2 = ( 5 + 4, 0 + 0, 9 + 2 )
V1 + V2 = ( 9, 0, 11 )


A imagem abaixo mostra o operador Blueprint da soma de vetores:


  • Subtração de vetores: 

A subtração entre dois vetores é feita subtraindo cada um dos seus elementos.

Exemplo: 

V1 = ( 12, 0, 14 ) e V2 = (4, 0, 8 )
V1 - V2 = ( 12 - 4, 0 - 0, 14 - 8 )
V1 - V2 = ( 8, 0, 6 )


A imagem abaixo mostra o operador Blueprint da subtração de vetores:



  • Comprimento de vetor:

O comprimento ou magnitude de um vetor pode ser calculado usando a ação blueprint abaixo. Este valor pode ser usado para representar a distância entre dois pontos.


  • Normalização de vetor:

Usamos a normalização de vetores para encontrar um vetor unitário. O vetor unitário possui o comprimento igual a 1. Ele é muito usado quando precisamos apenas indicar uma direção. Em alguns cálculos devemos somente usar um vetor normalizado.

  • Multiplicação de um vetor por um valor:

A multiplicação de um vetor por um valor é feita multiplicando cada um dos seus elementos pelo valor. Esta operação muda o comprimento do vetor. 


Vamos ver todas essas operações sendo usadas em conjunto em um exemplo. Neste exemplo vamos mover um Blueprint pelo cenário em direção a um ponto aleatório. Quando o Blueprint chegar ao seu destino, será definido um novo destino aleatório.

Podíamos usar os componentes de movimento já definidos pela Unreal Engine, mas vamos fazer o passo a passo do cálculo de movimento para compreendermos os diferentes usos de vetores.

Vamos usar as seguintes variáveis no cálculo de movimento:



  • DeltaSeconds: Esta variável guarda o valor passado pelo evento "Tick" que representa o tempo que passou desde o último "Tick".
  • Speed: Guarda o valor de velocidade do Blueprint. O valor padrão é 100 (cm/s).
  • vDestination: Vetor que guarda a posição para onde o Blueprint tem de se mover.
  • vDistance: Vetor que indica a distância da posição atual do Blueprint até o seu destino.
  • vDirection: Vetor unitário que indica a direção que o Blueprint deve seguir para chegar ao seu destino.
  • vVelocity: Vetor que representa a velocidade e direção do Blueprint em cm/s.
  • vStep: Vetor com o resultado final do cálculo que indica o movimento que o Blueprint deve fazer no "Tick" atual.

Foi criada uma Macro com o nome "SetRandomDestination" para definir um destino aleatório. Neste exemplo o valor do eixo Z está fixo em 300 e os valores dos eixos X e Y podem variar de -1000 a 1000. O vetor criado é armazenado no vetor "vDestination".

Clique para aumentar

Neste exemplo não está sendo levado em conta nenhum tipo colisão. Então o teste precisa ser feito em uma área sem obstáculos.

A Macro "SetRandomDestination" precisa ser chamada no evento "BeginPlay" para definir o destino inicial.


A imagem abaixo mostra a primeira parte do evento "Tick", onde é calculado cada um dos vetores até chegar no valor do "vStep". Todo este cálculo podia ser unificado em uma única expressão matemática, mas mantive cada parte do cálculo separada para facilitar a compreensão.

Clique para aumentar

A segunda parte do evento "Tick" move o Blueprint usando a Ação "AddActorWorldOffset" e testa se o Blueprint já chegou em seu destino. Este teste é feito comparando se a distância atual é menor do que o valor da variável "Speed". Se for verdadeiro, um novo destino é definido.

Clique para aumentar

No meu exemplo usei uma mesa voadora para representar meu Blueprint:



Anterior: Pontos e Vetores
Sumário