A runner game with characters and scenery based on the Aztec culture. You have to collect food to feed animals and to eat it to keep going. Currently on final stages of development.
A 4 level mobile game with innovative controls. To give the effect of holes in wall objects, objects with holes and no holes were combined and their texture uv coordinates were modified along them to make them appear to be the one whole object. A GUI, scenarios, animations, puzzles, sub-boss, final level bosses, swipe actions, rewards, tutorial, languages (Spanish and English), game settings and difficulty levels were added.
A local network penalti game for two players. The characters can be customized in colour and choose between different hair styles. The direction of the shootout and where the goal keeper moves is controlled with a finger swipe. Spanish and English languages.
Local network party game for up to 16 players. The game has 8 minigames. The players get points depending on the order they finish the minigames. The ranking is shown in a points table. Spanish and English languages.
Local network dominoes game for up to 4 players. The game has 2 vs 2 and All vs All modes. Spanish and English languages.
You have to protect humans from zombies setting actions to bring zombies to their home. The actions for the zombies and the humans are set by touching interactable squares in the scenery, when they touch these squares they execute the action. 72 levels were developed. The game has over 50K downloads and around 5K montly users.
Small game developed for a gmtk-2024 game jam. Player has to help robot get to the exit while jumping, shotting objects to resize them and doing it before the acid fills the place.
The game can be played on the browser here.
I was in charge of the character: movement, animation, shooting, VFX, SFX. I also developed the first 3 levels, implemented moving platforms, doors, switches, sound manager, improved moving acid. I dealt with the musician and the 2D artists, then integrated their work into the game.
An app to help learning to play the guitar. A synthesizer was developed to produce the sound of the guitar. The user can drag chords and pair them with strumming patterns. The user can change the angle and speed of playing. The user can save, share and download songs.
An Oculus Rift football demo was developed. Movement for each of the players was defined. An interesting problem to solve was the ball movement. Splines and functions were used to simulate the speed decrease of the ball in the grass. The spline time parameter is given by the integral of a function.
The app presents two words, the one which it is wanted to learn and a similar word. Similar words are chosen from a dictionary or made up randomly matching the consonants. Only for Spanish language. Â
A custom app developed for a company selling medicine. Sale agents can register clients, link them with doctors and sell products outside of their headquarter offices.
Mobile application to track the route of public transport units. GPS coordinates are stored in a database so an administrator can check the route and timings of each unit. The tracking is done using the mobile phone GPS sensor.Â
Marketing demo for digital signage. A video is displayed on the 5 virtual monitors. Digital signage models are generated from a few guide points.
App to show clients wardrobe design proposals according to real spaces. Currently in development.Â
Gui prototype for a security surveillance system. When clicking on the cameras the current feed of the camera is displayed, when double clicking the camera feed is shown in full screen.
Planar bones were implemented to try to deform a mesh into another mesh. This is with the idea of having a standard face model and modify it to match one of a real person from a set of tracked points. Results showed areas where there are no tracked points are hard to match.
Figure A: car steering
Figure B: car stopping
Investigated different tools to generate cities. Some work on an autonomous car to simulate traffic on a city was done. Car models were set-up to have functional lights (stop, turning, reverse). Thanks to the implemented AI, a car is able to follow a route in the city while keeping in the centre of the line, also the car steers (Figure A) or stops (Figure B) when another car is in front. The AI is based in way-points, Finite State Machines and a Proportional-Integral-Derivative controller. Things that will be added are: more routes, traffic lights and pedestrians.
Figure A: 8 different cars
Figure B: Shader to display badge
Figure C: Racing game
8 cars were configured for the game (Figure A). A few CG shaders were written to display the cars correctly (Figure B). Automation code to configure cars was written. Work on the AI for the cars was done. It is based on Finite State Machines, waypoints, distance sensors, Proportional-Integral-Derivative controller and driving lines. More work on cars AI is needed to create opponents with different skills. More tracks, mesh deformation and mesh deformation can be added.
Figure A: Car tutorial
Figure B: 3D platform tutorial
Unity tutorials were followed and finished. For the Car tutorial some functionality was improved on the hand brake code and lights code. For the 3D platform tutorial sound was added to the character movement which implied some changes to the original code.
Developed in a game development bootcamp. It is a 2 player coop game with 8 minigames. Players control a human and a dog. The objective is to help the human have a perfect date by modifying or obtaining objects from the past/future. The outcome from each minigame will have an impact on the date, for example, players have to help discover fire or the wheel and as a result the human will/won't take a shower because of the water temperature, the ride to watch a football game will/won't be smooth because the cars wheels (round/cubic). The human is by luck selected to have penalty shoot at the game's half time, depending on whether wheel or rubber was discovered the ball will be round/cubic and metal/rubber. I developed 4 minigames: a minigame to destroy rocks by jumping on them, a minigame that is a dungeon made of different blocks with switches, platforms and guards (including AI), a minigame to collect rubber with an environment full of raccoons (including AI) and a minigame were players drive a car each and collect gems from falling meteors.
Survaval game done for a game jam. Waves of enemies appear, player has to find the gun and ammunition, the amount of ammunition that the player can carry is restricted so the player has often to look for it. Enemies are like shadows that can blend to make bigger enemies. I was in charge of programming: player controls, aiming system, weapon and picking system, health system and GUI. Also integrating the characters, SFX, VFX. Different sounds for the steps and the bullet hitting depending the surfaces was added. Most of the coding was done in C++ and a few parts on blueprints.
The player has to reach a control room to stablish communication with another moon base. For that to happen the player has to find its way to the moon base, once inside has to solve some puzzles using items in the environment to destroy gates, switches to activate or deactivate platforms or objects, open doors, switches to change gravity, anti gravity zones to reach areas or black and white hole guns that atract/destroy or repel objects.
Developed in a game development bootcamp.  The game is set in a factory where AI-controlled robots have malfunctioned, taken over, and trapped the workers. The factory consists of several sections, each locked and requiring a switch to be turn on to access. Player’s aim is to shut down the rogue AI to regain control of the factory and finds some trapped factory workers and free them so they can scape.
I worked on the environment from a pre-made environment. I had to delete objects that were between the camera and the player, this approach was chosen to gain performance, but also worked on automatic disabling objects in smaller stages. Also configured the character and set the initial animations and movement which later were improved by another member of the team. I improved the projectiles. I worked on easy to defeat enemies and obstacles, like drones dropping bombs, static robots that shoot in one direction. robots that move and shoot on the direction they are facing. I designed and implement puzzles and the level progression, starting without the gun, solving puzzles, obtaining the gun and then defeating robots.
To carry the investigation for my Ph.D. studies, a 3D talking head was implemented. It connects with Festival TTS synthesizer (English and Mexican-Spanish), Matlab and Python.
It's implemented in C, OpenGL and Matlab. An instance of the talking head is created in Python, a sentence in the form of text is received, it is passed to Festival to retrieve phonetic information and to generate an audio file of the spoken sentence. The phonetic transcription is used to set the key-frames (visemes) to be used in the form of animation parameters (PCs from Principal Component Analysis).
Simple interpolation can be used or a Constraint-based approach implemented in Matlab. The animation is created and synchronized with the audio in real-time.
The idea behind Talking Heads is to automate the animation process so sentences in the form of audio or text are passed as input and then the animation is generated. Expressions can also be introduced. Talking Heads benefit from coarticulation models to improve visual results.
Videos:
Talking Head (avi, 154kb)
Talking Head internal parts (avi, 376kb)
As part of my Ph.D. studies, a coarticulation model was implemented. This model is a modification of Edge and Maddock (2003) work which in turn is based on the Spacetime Constraints technique applied to key-frame rigid body animation (Witkin, 1998). A set of targets (mouth poses in the form of visemes) is defined and the animation curve (represented as a bi-cubic non-uniform spline curve) has to pass through the targets while a set of defined constraints prevent the curve reach the targets simulating the coarticulation effect.
Range constraints keep the curve within a range, local acceleration constraints restrict the local acceleration between two given visemes, a global acceleration constraint restrict the global acceleration of the curve. The model was tuned using recorded facial mocap data from two speakers at two different speeds using Vowel-Consonant-Vowel (VCV) segments. Tests were done synthesing VCV segments and non-sense words (with no consonant clusters). Future tests will involve synthesizing real words (which include consonant clusters).
Videos:
Constraint-based coarticulation model concept (avi, 320kb)
Synthesizing a VCV segment (mouth opening parameter) (avi, 5.37mb)
Synthesizing a non-sense word (mouth opening parameter) (avi, 5.85mb)
As part of my Ph.D. research, I developed an off-line 3D facial motion capture system using two high speed cameras (300 fps), glow in the dark home-made markers and Matlab. I'd like to make improvements to this system such as removing the markers and using Active Appearance Models to track automatically features of the face.
Video:
View of the two cameras (avi, 1.02mb)
Tools to deal with the 3D facial motion captured data were developed.
To retrieve the 3D coordinates of the markers, these have to be tracked on each camera. A tool to track and check the markers on the face was implemented.
Visualization of the 3D reconstruction is needed to check the results. A tool to check the 3D reconstruction results was implemented.
As the 3D reconstruction contains noise due to the nature of the camera sensors the data has to be cleaned. A tool to filter the 3D motion data using Kalman filter was implemented.
Several techniques were tried to rig a 3D face with mocap data such as point deformers, planar bones and neural networks. The one that gave better visual results was a mix of RBFs with statistical methods (PPCA) implemented in Matlab. A video example of the results can be observed here. This technique can be expanded to predict tongue movement.
Video:
Skin mesh (3D data a bit noisy) (avi, 496kb)
The parametrization used for the animation on my Ph.D. research was based on Principal Components (PCs) from Principal Component Analysis. A tool to calculate the PCs and visualize the effect of varying the value of each parameter (individually or in group) on the 3D face was implemented using Visual C, Matlab and OpenGL.
In several stages of my Ph.D. it was needed to select some points of the 3D face mesh. A tool to retrieve/save these points was developed using Visual C and OpenGL.
As part of the talking head developed for my Ph.D., internal parts of the mouth were modelled using 3D Max. The parts modelled include gum, teeth and tongue.
Video:
Tongue and mouth internal parts animation (avi, 376kb)
This tool was developed as part of a research project including collaboration between people of the Computer Science Department and the Dentistry Department of the University of Sheffield. Students have access to a scanner to scan their crown preparations. The tool allows them to observe differences between their preparation and a correct preparation. Also to take measurements of distance and angles so they can verify they are doing the correct preparation. Visual C and OpenGL were used.
This tool was developed as part of a research project including collaboration between people of the Computer Science Department and the Dentistry Department of the University of Sheffield. Remote communication for remote consultation and teaching was investigated using this tool. Two individuals are able to manipulate a 3D model from different locations, they can observe each others drawings. TCP/IP sockets in Visual C and OpenGL were used.
In my free time I added some features to this project. Audio communication was added using SkypeKit. Users could login using a Skype account. Ability to record video at any of the ends was implemented.
A block of skin tissue was implemented to simulate the effects of bruising as final project for an M.Sc. degree. It is a physically based block consisting of blocks of tetrahedrons. Each tetrahedron consists of mass spring-dampers. Tetrahedrons have internal forces to prevent collapse and to preserve volume. The Runge-Kutta ODE solver was used to calculate the positions of each vertex at each instant of time.
A program that plays dominoes was implemented in Matlab for a thesis for another M.Sc. degree. The program plays in modalities of two players (one against one) and four players (two against two). The AI relies on search trees, the Minmax algorithm and probability-based heuristics.
The program performs like a medium level player. Further improvements can be done incorporating a knowledge database and Reinforcement Learning. Strategies similar to the ones applied here can be used in problems with uncertainty where the whole state of the world is unknown.
Two different Navigation systems were implemented as part of an M.Sc. module. The first one used a Proportional-Integral-Derivative controller to drive a mobile robot through corridors. Maps and landmarks where used so the robot could deliver mail from one office to another.
The second one was implemented by using supervised learning with Artificial Neural Networks. The robot was trained to wander corridors while keeping a central position between walls. The programming was done in C and Matlab.
This implementation uses real numbers instead of bits (called Evolution Strategy) and was done in Matlab. Several genetic operators where implemented such as: mutation, crossover in one point, crossover in multiple points, extrapolation crossover, mean crossover, weighted mean crossover and local intermediate crossover.
Each genetic operator acts on a percentage of the whole population. Greater percentage is given to the operators that perform better and less population to the ones that don't perform well. This percentage is varied through the evolution as the performance of the operators change. Some operators perform better at the first stages of the evolution but at later stages others perform better than them. This implementation was tested on an optics optimization problem where the parameters of lenses had to be found.
Genetic Algorithms are good for optimization problems as they usually don't fall on local solutions. Genetic Algorithms have been used on the creation of AI strategies for computer games. These algorithms have also been used successfully in modelling to generate diverse 3D objects.
This program allows several users to have an audio conversation. A server waits for incoming calls, when a call is received it sends back a Session Description message (SDP). The caller interprets it and stablishes communication with the server. The audio packets transfer is carried out using the Real-time Transport Protocol (RTP). The audio from one user is coded and sent to the server. The server receives the audio from the connected users, mixes the audio from all the users and sends the stream to the connected users so everyone listens to what everyone is saying. This was implemented in C under Linux OS.
This program allows browsing the file directory of a Windows PC from a Linux PC. It was implemented using TCP/IP sockets using a client/server architecture. The Windows side plays the role of the server, it was programmed using Visual C. The Linux side plays the role of the client. It was programmed in C and the GUI was created using Gtk libraries.
As projects for an M.Sc. module, I designed different microprocessors (4 bits CISC, 8 bits CISC, 32bits RISC) in VHDL language. For each microprocessor the instruction memory, the control module, registers, RAM module, ALU, ALU control module were implemented. Active HDL was used for the functional simulation.
I like playing guitar and when I am not in a band I like playing along backing tracks. Producing the backing tracks to later play along them is a demanding task and requires lots of time. To help me reduce the amount of time needed to produce backing tracks I implemented a concatenative guitar synthesizer (C and Matlab). I think the results are good and I plan to extend it by adding more guitar playing techniques (using more recorded samples and Machine Learning techniques).
Audio:
Toccata and Fugue (J. S. Bach) (mp3, 4.88mb)
I've been playing guitar for 14 years and have been part of several bands. My role has been usually as lead guitar. I have played and recorded in different music types and usually I adapt to the band style. My contributions range from full songs; solos; full guitar tracks; guitar, bass, keyboard and drum parts.
Here I put a few representative samples.
Progressive Metal:
Evergreen fool (Eternal Recurrence) (mp3, 3.96mb)
Devil may care (Eternal Recurrence) (mp3, 9.36mb)
Psychedelic Rock:
Golden snake (Toi) (mp3, 2.72mb)
Nietche's town (Toi) (mp3, 1.98mb)
One of my favourite bands is Guns and Roses. Here are a few songs of my instrumental tribute where I play all guitars, also, a bit of improvisation instead of vocals:
Don't cry (mp3, 4.27mb)
Estranged (mp3, 8.68mb)
Also, I have a youtube channel were I uploaded some videos of me playing Guns and Roses and Metallica songs: