Zandria Ross | Lighting Artist
  • Demo Reel
  • Resume
  • Projects
  • Photography
  • Doll Story

Shibuya Crossing



Stats

Softwares Used:
  • Houdini 16
  • Motionbuilder 2017
  • Vicon Blade 3.3.1
  • 12 Vicon MX Series Cameras
  • Photoshop
  • Adobe Fuse
Project Length: 3 Weeks
Render: Mantra
Size: 720 x 480
Render Time: 4.5 minutes per frame
Number of Agents: 1500

The Concept

Picture
source: Tom Page
Located in Tokyo, Japan, Shibuya Crossing is the busiest pedestrian crossing in the world. When at it's peak, up to 3,000 pedestrians will cross during the 2 min crossing cycle.

Research

Shibuya Live Stream
The best way to know crowd behavior is to study it. For this project, I was fortunate enough to have an on going live stream to watch as I worked. I also use it to focus in on general crowd behaviors.

The images below are screenshots from the Shibuya Live Stream.

This stream may not play on my site. Click here to go to the YouTube page.
Picture

Phase 1:  The Build Up

A mass of people gather on the corners waiting for the light to change. Many of them stand very close to the edge of the side walk.
Picture

Phase 2: The Scramble

The light has changed and pedestrians are able to cross the street. They have 2 minutes to make their way across. Notice how the majority of the swarm follow the cross walk but there are several completely not following the lines.
Picture

Phase 3: The Scragglers

These are people that waited for the mass of the crowd to cross first or arrived at the cross a few moments after the light change.
Picture

Phase 3.5: Don't Get Hit

The last bit of scragglers are still on the crossing after the light has changed and cars have started to go. Most of them either start running or coolly fast walk  to the sidewalk.

Motion Capture

Picture
The actor suited for motion capture was David Pressler. Also, behind the scenes was Erin O'neal and Ali Nikkhouy.

The three main cycles that I focused on were a walk, jog, and rest. These are the bare minimum cycles I need to recreate the crossing.

​We captured data using Vicon Blade with a 12 camera stage. We recorded the same action several times in case of tracking issues. I had our actor, David, walk through the volume instead of walking on a treadmill.

Character Creation

Picture
Meet Dale! I created him using Adobe Fuse and created his rig through Mixamo. He will be our main character for this project.

Fuse is a simple and yet powerful 3D Character creator. It connects with mixamo.com where the character goes through an auto-rigger that can even rig the fingers. Mixamo also has motion capture animations that can be baked onto the Fuse character. For this project, we had to create our own animations so I did not use any of their data.

Motion Builder and Baking Animation

I used the best data that was captured and exported fbx files of the skeleton from Blade. I used Motion Builder for clean up and baking the motion capture animation onto Dale's rig.

Character Setup

Picture
1: Import FBX file with animation into Houdini. Check 'Override FBX Frame Rate' and set to 24 fps.
Picture
2: Click on Bake Agent in the crowd shelf tool menu.
Picture
3: ​Select a FBX and name the Agent
Picture
4: Name the Animation Clip
Picture
5: ​For Mixamo rigs, select the Left and Right ToeBase_bone and Toe_End for Ankles and Toes for Foot Locking 
Picture
In the OBJ level, two new nodes are created. Dale_Setup and agent_bake. 
Picture

Dale_setup

Dale_setup is where we can define joints and adjust the character's collisions.  I primarily focused on the 'agentprep' node.​ I tried building the collisions, but I was unable to set them up properly.
Picture
Agent Prep node is for defining joints. By default, Houdini does not recognize which joints of the rig translate to  which body part. Setup of this node further helps Houdini calculate proper foot planting. 
Picture

agent_bake 

agent_bake allows adjustments to the animation clip and gives Dale translation movements. 

Start/End/Inc is where I adjusted the clip. I used MotionBuilder to quickly find the frame range that loops.
Picture
Locomotion Node should be the Hips of the rig.
/obj/RestLooking_002_Dale_fbx/mixamorig_Hips
Check on 'Convert to In-place animation'. Houdini will remove any translation global X and Y information but keeps the animation. 

Environment Setup

Picture

Terrain

​For creating the terrain, I used Google Maps to take a top-down screenshot of Shibuya Crossing. To make the image easier to read, I traced simple shapes outlining the street and buildings in Photoshop. From there, I brought the maps into Houdini and extruded curves to form various parts of the city.
Picture

Agent Spawning

Originally, agents were spawning over the whole sidewalk. After realizing, I wanted a light scene with a bigger swarm of people, I created curves to define where I wanted the crowd to spawn (in green).
Picture

Obstacles

Obstacles are a hidden force used to help guide the crowd. I created them from the buildings (in blue) and also created a wall in the middle of the street (in orange).
It is very important that the obstacles sink lower into the ground. I found with some obstacles that are on top of the grid, agents may not recognize them and walk straight through them.

Crossing Light

The stop light is the core of controlling the crowd. It signals them to either stop or go. A switch node is used to change the light after so many frame. It toggles between 0 and 1 with 0 being the green material and 1 being the red material. The code behind it is: floor(1-sin($FF*0.8)/2). Currently, the lights will switch just under 4 seconds. Lowering the 0.8 will increase the length of the light.

​Using this information, I created several Attributes that reference the toggle.
Picture
So let's define some boundaries!

​Behind the scenes, I created the stop light’s bounds. This means that anything inside them would be influenced by the color.
​
Think of this space as a way for the agents to see if the light wants them to stop or to go. There are three to keep up with: Sidewalk Bounds, Street Bounds, and Street Inner Bounds.
Picture

Street Bounds

Street Bounds are for the agents on the sidewalk to read if the light changes. 

​When the light is Green (attribute value of 0), the agents will see that they can safely start to cross the street.
​
​When the light is Red (attribute value of 1), the agents will see that it is not safe to cross the street and will stop at the edge of the sidewalk.
Picture

Street Inner Bounds

Inner Bounds are for the agents in the crosswalk to read if the light changes.

When the light is Green (attribute value of 0), the agents will calmly continue to walk across the street.
​
​When the light is Red (attribute value of 1), the agents will realize that need to finish crossing and they will start jogging.
Picture

Sidewalk Bounds

The sidewalk bounds are agents ​that started jogging across the street and they have made it back on the sidewalk.
​
​When the light is Red (attribute value of 1), the agents will realize that they are back on the side walk and will stop jogging and start walking.

Houdini Crowd Mind

Picture
Picture

Crowd Goal

I used a POP Steer Seek node to control where the agents were going. By setting the 'Attraction Type' to Points, having the Match Method to ‘Point per Particle,’ and check on the ‘Particle ID’ and ‘Goal ID,’ Each agent will randomly choose a point to walk toward. I created the points using the same network that I used to create the spawn and added a Scatter node to create the points. I set the number of points to a similar number as the amount
of agents. This gave the agents their own unique goal.

​Originally, I was using the POP Steer Seek node with the ‘Position’ attraction type. I did not use this method because it caused all the agents to go towards one defined point. What I did learn from using this method was that some agents will hover and stay at the point and other agents reach the point and continue past it.
Picture

The Brain

​Crowd Transitions control how the crowd will move. By carefully configuring Crowd Trigger node, the agents  will *mostly adhere to the commands.

For grasping the concepts of a stop-and-go crowd, I referenced the Houdini Crowd Street Example. This example helped me with understanding attributes. As helpful as this reference was, the example was created in Houdini 15.5 and there were several changes with the crowds tool in Houdini 16 (the version that was used). 
Picture
Picture

Constant Factors

The 'Current State' trigger check if the agent has been in that certain state for at least 0.1 seconds.
There are triggers for each of the various boundaries. Each one of them continuously checks if the agent is behaving correctly with the boundaries.
Picture

Trigger #1

This trigger lets the agents that are on the sidewalk to stop walking when they see that the light is red.

If the StreetBound has an attribute value of 1 and the agent's current state is walking then go from walking to resting.
Picture
Picture

Trigger #2

This trigger lets the agents that are on the sidewalk to start crossing the street once the light has change to green. 
​
If the StreetBound has an attribute value of 0 and the the agent's current state is resting, then go from resting to walking.
Picture
Picture

Trigger #3

This trigger lets the agents that are in the street after the lights have change to quickly s tart running to make it to the other side of the street.

If the StreetInnerBounds has an attribute value of 1 and and the agent current state is walking, then go from walking to jogging.
Picture
Picture

Trigger #4

This trigger let the agents that make is across the street of the light has changed know that they've made it safely across and for them to go from a jog to a walk.

If the SidewalkBound has an attribute value of 1 and the agent's current state is jogging, then go from jogging to walking.
Picture

Material Stylesheets

As you may or may not notice when watching my crowd, the agents start off very colorful and then about half way through, they all turn blue. This is because after I called "Final" on the project, I went back into the file and tested material stylesheets. I was able to cache and rerender only about half the frames working.

The first step to defining any material is to make shaders. I created 7 principle shaders that each have different colors associated with them. There was no color scheme to them, but I wanted a clear variety of colors.
Picture
Between the 'crowdsource' and the 'agentconstraintnework' node, I am using a attribute wrangle. This attribute looks at every agent in give them a number between 0 and 6.
​
I am using this code: i@color = floor(fit01(rand(@ptnum),0,6));
Picture
Open the Data Tree tab and pick Material Style Sheets as the viewer. Drop down the obj level and right click on crowdsource and select 'Add Style Sheet Parameter.' Then right click on Style Sheet Parameter and select 'Add Style.' Right click on 'Style' and add a target and an override. Finally, right click on 'Target' and add condition. I repeated the steps from 'Add Style' until I have created styles for all 7 shaders.
Picture
The final setup should look something similar to the image on the left, but there are a few more steps to setup. For the 'Condition,' I changed the Type to 'Primitive Group' and set the Value to @color== and a integer. In the 'Override', I changed the Type to 'Set Material,' and Override Type to 'Material,' and I pathed the material in the Override Value.

Quick Tip: Shift + Left click on the plus boxes. This will open all the minimized tabs within a folder.

And that is how this crowd was made...


The Problems...

Picture

Problem 1: Exploding Character

In early stages, I had multiple characters in the same 
crowd source node, but about 70% of the agents would explode. What I think happened was the rigs for each character were going on to the wrong agents and weights for the characters were causing the agents to break. The easiest way around this was having to scale back to using only 1 character.
​
A possible way around this could have been having multiple crowd sources. In order to do this, I need to have collisions working properly so that the two crowd sources do not phase through one and another.
Picture

Problem 2: Float or Sink

This was a fun little problem. The agents would start off walking on the ground and after a light change, they learned how to either fly or sink.

I believe this issue was caused because the crowds only had a 'groundplane' to define the floor. After I added the modeled street as a terrain object, the agents were able to walk properly.

Further Exploration

Picture

More Animation Cycles

I had several more Motion Capture actions I intended to use. From standing in place while texting to walking while texting. After presenting the final version above to the class, I learned how to successfully implement a variety of states. Within the 'crowd_sim' DOP Network, using a crowd state node, I needed to add more clips in the 'Clip Selection' section. The problem with using this method is the inability to adjust the Gait Speed of each clip separately. 
Picture
Picture

Material Stylesheets

I was able to successfully assign all of Dale's textures, however, I was unable to assign hue shift or color jitter that would affect each agent differently. There were a few steps that had to be done differently than how I got the colorful crowds.
Picture
In the Data Tree, I had to define sub-targets and set the 'Condition' type the 'Agent Shape.' In the Value box for the 'Condition,' I created a name for the shader that will be called upon in an 'Agent Layer' SOP. Finally, I set the 'Override' override value to link to the shader.
Picture
Within the crowdsource node, I had to create an 'Agent Layer' SOP. Next, I added Layer Bindings and defined each Transform Name with the mixamo_Hips. The shape is where I defined each shader that is attached to Dale's geometry.

With More Time...

Picture

Longer Stop Light Time

I want the first wave of agents to finish crossing the
street before the next wave starts. I also want to polish up the stopping signal so that there is a bit of a warning for crowd still on the side walk to stop.
Due to time constraints and number of frames, I focused
on the crowd behavior verses a finial, more realistic
polish.


Remember to keep OBJ Level Clean

Picture

Original PDF

ShibuyaCrowds_Breakdown_ZandriaRoss.pdf
File Size: 4321 kb
File Type: pdf
Download File

Here is the original breakdown pdf. I will warn that there are several spelling mistakes and other grammatical errors. Please refer to this webpage for corrected information.
Powered by Create your own unique website with customizable templates.
  • Demo Reel
  • Resume
  • Projects
  • Photography
  • Doll Story