sábado, 22 de agosto de 2015

Coordenadas locais e de mundo

O espaço 3D é representado através de 3 eixos: X, Y e Z. Existem diferentes formas de organizar estes eixos. A Unreal Engine usa a seguinte forma:


Isto pode ser visto no "Translation Widget" dos atores: 

Clique para aumentar 

Qualquer posição no espaço 3D pode ser representada usando o conjunto de valores X, Y e Z, que indica a posição em cada um dos eixos. Este valores ficam armazenados na variável "Location" de um Ator e são conhecidos como coordenadas de mundo:


Uma Unidade Unreal equivale a um centímetro. Para usar o valor de "Location" em Blueprint podem ser usados as seguintes funções:


A função "GetActorLocation" retorna a posição atual do Ator. A função "SetActorLocation" define uma nova posição para o Ator. A função "AddActorWorldOffset" modifica a posição atual do Ator de acordo com os valores do parâmetro "Delta Location". O exemplo abaixo acrescenta 1000cm no eixo X da posição atual do Ator e não modifica os valores dos eixos Y e Z.


Existe outro conceito conhecido como coordenadas locais. Para compreendermos este conceito vamos usar um Blueprint que possui dois componentes do tipo "Static Mesh".

Crie um novo Blueprint do tipo "Actor". Na aba "Components" adicione um novo componente do tipo "StaticMesh" e coloque o nome "Base". Arraste o nome "Base" e solte em cima do componente chamado "DefaultSceneRoot":


Fizemos isso para que a posição do StaticMesh "Base" represente a posição do Blueprint, ou seja, este StaticMesh passou a ser o "Root" do Blueprint.

Para este componente, selecione o Static Mesh "SM_AssetPlatform" e como Material use o "M_Tech_Hex_Tile" que fazem parte do "Starter Content":


Adicione outro componente "StaticMesh", coloque o nome de "PowerPill" e faça as seguintes configurações:


Na variável "Location" do "PowerPill" coloque o valor "70cm" no eixo Z:


Esta posição do "PowerPill" é relativo ao "Root", que é o componente "Base", desta forma quando movermos a "Base", o "PowerPill" irá acompanhar este movimento, pois ele sempre tem de estar a uma distância da "Base" de 70cm no eixo Z. Esta posição relativa é conhecida como coordenada local.

Você pode ver como ficou o Blueprint na aba "Viewport":


A posição do componente "PowerPill" pode ser obtida de duas formas. Podemos consultar a sua posição relativa que neste exemplo seria ( X=0, Y=0, Z=70 ), ou podemos consultar a sua posição de mundo, cujo resultado será a posição de mundo do componente "Root" mais a posição relativa do componente "PowerPill". A imagem abaixo mostra estas duas opções:


A posição do componente também pode ser definido de duas formas usando as funções "SetRelativeLocation" e "SetWorldLocation". A função "SetRelativeLocation"  define uma nova posição do componente em relação ao "Root" e a função "SetWorldLocation" recebe como parâmetro de entrada uma coordenada de mundo e define a posição do componente de tal forma que a soma da posição do "Root" com a posição do componente seja igual a coordenada de mundo informada.


Para modificar a posição relativa do componente pode ser usado a função "AddRelativeLocation":