Ir al contenido
The Witcher: A bard's tale

The Witcher: A bard's tale

·786 palabras·4 mins

Descripción general
#

The Witcher: A Bard’s Tale es un beat-’em-up / hack-and-slash cooperativo. Los jugadores controlan a Geralt de Rivia y Yennefer de Vengerberg mientras luchan para rescatar a Ciri.


Jugar

Sobre el proyecto
#

Es un proyecto universitario en grupo construido con un motor personalizado en C++ y OpenGL. El diseño se centra en un combate responsivo, encuentros cinemáticos con jefes y una presentación pulida. Mi trabajo abarca programación de gráficos, herramientas de gameplay y creación de contenido.


Mis contribuciones individuales
#

  • Skinning en GPU (skinning en vertex shader)
  • Sistema de subtítulos (importación JSON + efecto máquina de escribir)
  • Presentación de jefes (movimiento cinemático de cámara)
  • Enemigo dummy para pruebas de combate
  • Efectos de shader de disolución
  • Modelos de personajes principales y assets 3D
  • Iluminación de escena
  • Diseño de HUD y pulido de menús

Skinning con shaders
#

Para mejorar el rendimiento en tiempo de ejecución, movimos el skinning a la GPU (vertex skinning en el vertex shader). Cada vértice almacena:

  • un ivec4 de índices de huesos (máximo 4 huesos por vértice), y
  • un vec4 de pesos de huesos (un peso por índice de hueso).

En la CPU subimos un array de matrices de transformación de huesos (un mat4 por hueso). El vertex shader lee los índices y pesos de los huesos, construye una matriz de skinning a partir de las matrices de huesos correspondientes, y transforma la posición del vértice y la normal íntegramente en la GPU.

También corregí un error donde algunos modelos colapsaban hacia el origen. La causa raíz era aplicar las transformaciones de huesos relativas a las posiciones originales del vértice en lugar de usar el origen de la malla; la corrección consistió en calcular las posiciones con skinning relativas al origen de la malla y aplicar correctamente las transformaciones de huesos.

Animación de vertex skinning mostrando la deformación de la malla del personaje
Vertex skinning en GPU en acción
Animación mostrando el modelo colapsando al origen antes de la corrección del skinning
Demostración del error: modelo colapsando al origen antes de la corrección

Sistema de subtítulos
#

El juego incluye secuencias narrativas que requieren subtítulos. Utilizamos Subtitle Horse para crear los subtítulos y los exportamos a JSON para integrarlos fácilmente en nuestro motor.

Implementé un Gestor de Subtítulos que:

  • Carga los tiempos y textos de los subtítulos desde archivos JSON
  • Muestra líneas temporizadas con un efecto de máquina de escribir
  • Sincroniza los subtítulos con los tiempos de las cinemáticas
Visualización de subtítulos con efecto de máquina de escribir durante una cinemática
Subtítulos con efecto de máquina de escribir
Fotograma final de cinemática con subtítulos
Fotograma final de cinemática con subtítulos

Presentación del jefe (cámara cinemática)
#

Para las introducciones de los jefes creé un sistema de cámara cinemática. La cámara sigue una curva de Bézier para centrarse en el jefe con un revelado dramático, y luego regresa suavemente al jugador antes de reanudar el gameplay.

Está implementado como un pequeño script que muestrea una cúbica de Bézier en tiempo normalizado e interpola tanto la posición como la orientación.

Movimiento de cámara cinemática enfocándose en el jefe durante la intro
Introducción cinemática del jefe usando un camino de cámara Bézier

Enemigo dummy
#

Implementé un enemigo dummy para el entrenamiento de combate. El dummy permite a los jugadores practicar ataques y combos, y ayuda al equipo a depurar la temporización de entradas, la detección de golpes y las transiciones de animación.

Enemigo dummy usado para probar el sistema de combate y combos
Enemigo dummy para pruebas de combate

Shader de disolución
#

Implementé un shader de disolución para transiciones de aparición/desaparición estilizadas. El efecto usa una textura de ruido (o ruido procedural) y un parámetro que controla una máscara de umbral, creando fundidos suaves y controlables con detalle en los bordes.


Modelos 3D y assets
#

Produje personajes y assets del juego, y aprendí el pipeline de producción artística: escultura, retopología en Maya, pintura de texturas en Substance y creación de bases low-poly para producción.

Geralt de Rivia
#

Arte conceptual 3D de Geralt de Rivia
Arte conceptual de Geralt
Proceso de retopología del modelo de Geralt
Proceso de retopología de Geralt

Yennefer de Vengerberg
#

Arte conceptual y retopología de Yennefer
Concepto y retopología de Yennefer
Yennefer renderizada en el motor
Yennefer en el motor

Enemigo Ghoul
#

Escultura conceptual del Ghoul en ZBrush
Escultura conceptual del Ghoul
Cuadro comparativo de tamaño del Ghoul
Comparación de tamaño del Ghoul

Otros assets
#

Creé props de entorno como arbustos, rocas y minerales utilizados en diferentes escenas.


Diseño de HUD
#

Creé el layout del HUD e iconos, iteré sobre prototipos de UI, e implementé iconos pulidos y elementos de feedback.


Pulido del menú principal
#

Para el menú principal añadí sistemas de partículas y un post-proceso de bloom global para hacer la escena más dinámica y atmosférica.


Ajustes de iluminación
#

Iteré sobre la iluminación de la escena para que coincidiera con la atmósfera de cada arena, equilibrando luces direccionales, contribución ambiental y elementos precalculados donde correspondía.


Enlaces y descargas
#