Back to List

Making it Snow with a HoloLens

Greg Levenhagen Greg Levenhagen  |  
Dec 22, 2016
If you’re hoping for a white Christmas, the HoloLens can help! This post will walk through the steps of creating a snowing app in augmented reality/mixed reality and what that looks like on a HoloLens. 

I’m using Unity, the HoloToolkit and a Particle System for this approach. The HoloToolkit provides open source code to help developers incorporate things like Input, Sharing, Spatial Mapping, Spatial Sound, Miscellaneous Utilities and Building of projects. 

Exporting HoloToolkit 
The first step is setup our Unity project to use the HoloToolkit. I prefer to clone the GitHub repository for working with in my local environment. 

Once you have the HoloToolkit downloaded, open the folder containing HoloToolkit in Unity, then in the Project window, right click the Assets folder and then select Assets -> Export Package. You can include everything and all dependencies. This will create a *.unitypackage file that can be imported into your other Unity projects.

Importing HoloToolkit
Now inside a new Unity project, right click the Assets folder again and select Import Package, then select Custom Package.

Browse to where your *.unitypackage file was saved and import it.

Setting Up Unity for HoloLens
Now we want to setup the Unity project for HoloLens development. Let’s start out by saving our Scene and giving it a name. In the Hierarchy windows, right click the Untitled scene and click Save Scene. This will ask you for a folder location and a name.

Next, we want to get the Camera setup. Right click and select Delete on the Main Camera, as we’ll replace it with one from the HoloToolkit. You can optional delete the Directional Light object, too.

Now in the Project Windows, browse to the Assets -> Input -> Prefabs folder so that you see HoloLensCamera. Drag the HoloLensCamera Prefab into the Hierarchy window under the Scene.

The HoloLensCamera has set the Clear Flags to a Solid Color with a Background of black, which allows the HoloLens to see the real world. It also has a Manual Gaze Control component to allow for camera control using a keyboard or mouse in Unity.

As part of importing the HoloToolkit, you should now have a HoloToolkit dropdown menu option in the main Unity menu. You need to individually select the Apply HoloLens Scene Settings, Apply HoloLens Project Settings and Apply HoloLens Capability Settings. The Project Settings may ask you to restart Unity, which is okay, but make sure you save changes when it asks.

For the Apply HoloLens Capability Settings, make sure to check the box for SpatialPerception, because we want to use that in our app.

The Snow Particle System
In order to have snow, I’ve chosen to use a Particle System. Add a Particle System by right clicking the Scene, selecting GameObject -> Particle System. After it’s added, you can right click and rename.

With the Particle System selected in the Hierarchy window, the Inspector window should look something like the following.

We want to change several of the settings. To start, let’s change the value of Start Lifetime to 10 and Duration to 10. This means the particles will die after 10 seconds and that the loop will last for 10 seconds. You could make this longer if you want the snow to still around.

For the start size, we want something that changes the snowflake size. Select the dropdown arrow on the right-hand side and select Random Between Two Constants. I have 0 and 1, but you can enter whatever you like.

The Gravity Modifier should be changed to a small value, like 0.05, so the snow falls down. Change the Simulation Space to World. Finally, change Max Particles to 5000 to provide more snow! Your SnowParticleSystem main properties section should now look like the following.

Under the Emission property section, you can increase the Rate over Time to make it snow more quickly.

Within the Shape property section, we need to change how the snow is produced. There are a lot of choices and we’ll go with a Box. Set the X and Y values to 10 and the Z value to 1. Depending on your area, you can adjust these values.

This produces a box, which we’re really treating like a plane for our purposes, to emit the snow particles.

Next, check the box for Collision and expand the property section. The top of this section will default to Planes and that should be changed to World. The next two values of Dampen and Bounce need to change so the snow hits an object and stays in place. To achieve this effect, the Dampen value should be set to 1 and the Bounce value should be set to 0.

We then adjust the Radius Scale to make the bounds for collision detection roughly match the size of a snowflake. I’ve increased the max collision shapes to improve collision checking, but reduced the quality for speed.

Now on to the Renderer property section. We want to change the Sort Mode to Distance. The Max Particle Size is something you may need to try different values, but let’s start out with 0.05.

Positioning the Snow Particle System
You may have noticed that the particle system is on top of our camera, so let’s move the particle system to have the snow falling over the camera. Within the Inspector window, find the Transform component and set the Y Position value to 10. If the snow isn’t falling over the camera, make sure the X Rotation value is set to 90.

Your Scene window should have something like the following. Notice the camera within the falling snow.

Adding Wind
With the SnowParticleSystem selected in the Hierarchy window, select Add Component in the Inspector window. Start typing Wind into the search bar and then select Wind Zone.

The Wind Zone component will add a 3D arrow to your scene as follows.

You can alter the values to adjust how the Wind manipulates the particles. Let’s set Pulse Magnitude to 1 and Pulse Frequency to 0.5.

In order for the Wind to have an effect on the particles, we need to tell the particle system to allow for external forces. Under the Particle System component, check the box for External Forces. At this point, you can play around with the Wind Zone. Keep in mind that we added the Wind Zone component to a Box based Particle System, so the Wind is blowing down. If you want to have a cross wind or some other effect, you’ll want to add another object to the scene and add a Wind Zone component to that new object.

Making the Snow Interact with Real Objects
If you were to run this project in your HoloLens, the snow would fall through real world objects, but we don’t want that. Let’s make it so the snow hits the floor and other objects in your real world.

Start by selecting the HoloLensCamera object in the Hierarchy window. We want to add some components in the Inspector window, so click Add Component. Do this twice and select Spatial Mapping Collider and Spatial Mapping Renderer.

In the Spatial Mapping Renderer property window, change the Render State from Occlusion to Visualization. This will allow you to see the triangles representing what the HoloLens sees as it maps out your environment. At this point, your snow particles should somewhat be stopping when they hit real world objects. I say somewhat because the size of the particles and what is getting used for a comparison isn’t a clean plane of the floor or other objects.

Give it a go at this point. You should have a decently running app. Remember to run it as Release, x86 and without debugging for best performance.

Changing it Up to Use Planes
The Spatial Mapping Renderer and Spatial Mapping Collider are provided by the HoloToolkit and give us a great start to interacting with real world objects. For more information about the Spatial Mapping, please visit

As a next step to extend this exercise, you could add the ability for using planes. The HoloToolkit has a PreFab for SpatialMapping in the HoloToolkit -> SpatialMapping -> Prefabs folder. Drag that into your scene. I’ve left the defaults for this PreFab, except for loading a Room Model to use with the Unity Editor.

You would then need to Create an Empty GameObject to your scene and call it something like SpatialProcessing. On this object, you will need to add the SurfaceMeshesToPlanes script that is included with the HoloToolkit.

You can optional add the RemoveSurfaceVertices script to make processing easier.

Finally, you’ll want to do something with the planes, like make sure they’re part of the World so that the Particle System can collide with them. Remember, we configured the Particle System to interact with the World. We could go back and specify collision to occur with Planes and add code to dynamically add the SurfaceMeshesToPlanes results to the Collision planes.

The HoloToolkit provides a sample test script for doing Spatial Processing called SpatialProcessingTest, so let’s add that onto our SpatailProcessing object. Your SpatialProcessing object should now look close to the following.

You’ll need to add the SurfacePlane PreFab as outlined above by selecting the Asset -> SpatialMapping -> PreFabs folder and finding it. This is will get used to instantiate any planes detected by the SurfaceMeshesToPlanes script. Using the drop downs for Draw Planes and Destroy Planes, you can configure which planes should make it into your World. Adjust the Scan Time for the Spatial Processing Test to configure how long the scanning of your world runs.

Note: If you don’t want to see the spatial mapping triangles or planes, you can back and change those Materials to Occlusion.

Give it go! Let us know how it went for you in the comments.

As you can see, working with Unity and Visual Studio can produce some very interesting effects when using a Microsoft HoloLens. We saw how a Particle System can be used to generate a snow-like effect in our real world and the HoloLens SDK and HoloToolkit help get us going.

The HoloLens has tremendous potential! At Skyline, we’re actively working with our clients on HoloLens projects and new innovative ways to improve their businesses. If you’re interested, please reach out and we would love to discuss opportunities with you.


Love our Blogs?

Sign up to get notified of new Skyline posts.


Related Content

Spring 2019 Kentico User Group
Apr 17, 2019
Location: Waukesha County Technical College - Pewaukee Campus - 800 Main Street, Pewaukee, Wisconsin 53072 - Building: Q, Room: Q361
Blog Article
Accelerating Flow in the IT Value Stream
Bob SchommerBob Schommer  |  
Jul 21, 2020
Every CIO grapples with how to rapidly turn customer needs or good business ideas into working software to meet the demands of a VUCA (volatile, uncertain, complex, and ambiguous) world. With traditional waterfall development methodologies, it frequently takes months (or even years) before...
Blog Article
How API Integrations Can Give Your Business One Source of Truth
Nick DopkinsNick Dopkins  |  
Feb 25, 2020
As an organization grows, so does its IT stack and the amount of applications it manages. If left unchecked, this can result in a multitude of disjointed programs that duplicate data, repeat logic, and know nothing about each other.   Implementing API integration to formulate one source of...
Blog Article
Fabric React Primer on Components, Controls and Theming
Will SpieringWill Spiering  |  
Nov 12, 2019
React is one of the most used and beloved JavaScript libraries for building user interfaces. There's no shortage of UI frameworks out there to help make developing great React apps quicker and simpler. You may have heard of a couple of the really popular ones like React Bootstrap or...
Blog Article
Using Hooks to Reactify a Plain JavaScript Library: A Walkthrough
Andrew PetersenAndrew Petersen  |  
Aug 06, 2019
React Hooks make it really easy to wrap a vanilla JavaScript library with a React component so you can easily reuse it throughout your app and stay in "React Mode".In this walkthrough I'll be focusing on a single library, Shave.js, but the techniques and ideas should be applicable...