Tutorial_cover_wpo

en Tutoriales, UE4

World position offset (Parte 1)

Un tutorial sobre manipulación de vértices utilizando materiales en Unreal Engine 4

En la primera parte de esta nueva serie de tutoriales vamos a mostrar como aplicar una manipulación de vértices a secciones especificas de nuestro modelo para simular la aplicación de una transformada de posición a parte del modelo.

El parámetro de entrada World Position Offset permite que ciertos vértices sean manipulados en el espacio global mediante su Material. Esto resulta útil para hacer que los objetos se muevan, cambien de forma, roten, y una gran variedad de otros efectos.

Con este tutorial vamos a aprender como modificar la posición de los vértices de un modelo utilizando la información almacenada en una textura. Vamos a aplicar la transformación de posición a los vertices de un cubo para cambiar su altura respecto al modelo.

El primer paso es preparar nuestro modelo, más concretamente el mapa UV del modelo. Podemos tener múltiples mapas UV asociados a un mismo modelo.

Un mapa UV  es la representación en 2D de la superficie de un modelo 3D utilizada para distribuir fácilmente las texturas. Por ejemplo, un mapa UV para un cubo 3D podría ser este:

cube_uvmap
Mapa UV de un cube

Para este tutorial vamos a crear un modelo con 4 cubos y vamos a poner cada uno de los mapas UV de cada cubo en una sección diferente dentro del mapa UV del modelo global. De esta manera cada vez que apliquemos un cambio a una sección todos los vértices del cubo contenido en esa seccion, y solo esos, se verán afectados.

4cube_uvmap
Mapa UV del modelo 4-cube

Si abrimos nuestro modelo en Blender, podemos ver la distribución del mapa UV utilizando la vista UV editor. Como se puede ver hemos puesto el mapa UV de cada cubo bien separado de los otros con una distribución de cuadrícula.

blender_uvmap
Blender UVmap view

Ahora podemos continuar con el diseño de la textura que vamos a aplicar. Vamos a utilizar la información almacenada en el color de cada píxel para mover el cubo, más específicamente los valores RGB.

Como podemos tener 3 valores diferentes por cada píxel y 3 ejes en nuestro entorno 3D podemos asignar un eje a cada uno de los canales de color, por lo que un incremento en el valor de ese canal se convertirá directamente en un incremento de ese eje en el modelo para todos los vértices contenidos en la sección de ese píxel.

4cube_offset
Desplazamiento de cubos usando la info de color

Por ejemplo, utilizando un píxel con un valor de RGB (255, 0, 0) modificaremos solo la posición en eje X del cubo, con un RGB (0, 255, 0) modificaremos la posición en el eje Y, y con un RGB (255, 255, 0) modificaríamos tanto la posicion en eje X como en eje Y.

Como tenemos un matriz de cubos 2 x 2 solo vamos a necesitar una textura de 2 x 2 píxeles para este modelo, cada píxel controlará uno de los cubos.

texture_detail
Detalle de la textura

Ahora ya podemos importar tanto el modelo como la textura a nuestro proyecto de Unreal Engine

Cuando importemos la textura tendremos que establecer la configuración de compresión (Compression Setting) a VectorDisplacementMap y el Filtro a Nearest

Ya nos podemos poner con el Material

Podemos encontrar el parámetro de World Position Offset en el nodo principal del Material.

material_node

Ahora añadimos un nodo Texture Sample con nuestra anterior textura y conectarlo directamente al parámetro de entrada de World Position Offset. Como tenemos nuestro mapa UV en la primera posición de la lista de mapas UV dentro de nuestro modelo tendremos que seleccionar el TexCoord[0].

4cube_mat_1

Con esto hemos movido los cubos en el eje Z, pero el desplazamiento a sido de sólo una unidad (el valor del canal de color del píxel dentro de la textura va de 0.0 a 1.0), asi que no podemos apreciar el cambio de posición de los cubos, necesitamos aplicar una escala al desplazamiento.

Para ello podemos añadir un nodo Multiply con el factor de escala que queremos antes de conectarlo al parámetro World position Offset.

4cube_mat_2

Con esto el desplazamiento de los cubos ya es apreciable a simple vista.

Algunos problemas

Cuando se utiliza el World Position Offset para expandir nuestro objeto más alla de su límite original, hay que tener en cuenta que el render utilizará sus límites originales. Esto quiere decir que podemos encontrar problemas de culling y errores con las sombras.

wpo_culling

Podemos seleccionar nuestro objeto e ir a las propiedades de la malla y establecer un valor mayor en Scale Bounds para compensarlo, hay que tener en cuenta que esto penaliza el rendimiento de dibujado y pueden aparecer errores con las sombras..

bounds_scale

Para encontrar el valor exacto necesario para eliminar el problema de culling podemos establecer en el material el mayor desplazamiento posible para los vertices del modelo y activar la vista de limites (Bounds) de los objetos en nuestra ventana de previsualización.

enable_bounds
Show > Advanced > Bounds

Ahora al seleccionar nuestro objeto aparecen sus límites dibujados en la escena.

bounds_viewport

Para destacar los píxeles que se estan dibujando fuera de los límites de nuestro objeto podemos activar la visualización de estos en el mismo menu

enable_outbounds
Show >Visualize > Out of Bounds Pixels
outbounds_viewport

Ahora solo necesitamos ir incrementando el valor de Bounds scale hasta que la zona ilumizada con los píxeles fuera de los límites desaparezca.

Y con esto hemos solucionado el problema de culling para nuestro modelo dinámico.

Tutorial files:

github

UE4 Project

Download

Download 4Cube Model and Texture

wpo_youtube
Ayudanos con este blog!

El último año he estado dedicando cada vez más tiempo a la creación de tutoriales, en su mayoria sobre desarrollo de videojuegos. Si crees que estos posts te han ayudado de alguna manera o incluso inspirado, por favor considera ayudarnos a mantener este blog con alguna de estas opciones. Gracias por hacerlo posible!


Escribe un comentario

Comentario

quince − 12 =