HoloLens: A Preview of the Future

I’ve had the rare pleasure of living with the Microsoft HoloLens for just shy of two weeks now, and I say this with complete confidence: this is the future of computing, it’s just not a near future.

A little background on me: I’m primarily a software security guy, but I also program as a hobby, having long since burnt out on doing it professionally. My main machine is a Retina Macbook Pro which scarcely left my side until recently; my whole life exists on this machine. I also use a homebuilt PC running Windows 10, but that’s largely just been there for entertainment purposes until now, despite its prominence in my office. Up until I got the HoloLens, my Windows development experience largely stopped in 2009 or so, and I hadn’t really used Visual Studio since VS2003. So to say that I’m not a Windows guy is a bit of an understatement.

The HoloLens has been a lot of little shocks for me. From the unbelievably nice editor that VS2015 provides (I thought I hated IDEs – turns out I just hate bad ones), to the sometimes terrible APIs provided by UWP (more on that in a moment), to the way that all the little problems just disappear after you use it for a little while.

The FOV is narrow. There’s no getting around that. If I had to give a rough estimate, I’d liken it to a 40" screen at 6 feet away. However, the only time I find this particularly bothersome is in games like Fragments, where you need to constantly scan the room to find little things. If you’re using it as a productivity machine, this is almost never a problem. Oddly enough, the best way I’ve found to use the device is simple: ditch every other screen. I’ll lay in bed with windows up all around me, and I never notice the narrow FOV. But if I’m in front of my laptop and desktop with windows to the sides, I expect to be able to read the content on them without moving my head – that just doesn’t work.

UWP – or the Universal Windows Platform – is Microsoft’s attempt to create a single unified API for experiences across desktops/laptops, phones, tablets, and HoloLens. There’s no way to sugar coat this: it falls flat. It’s not that the APIs themselves are poorly designed, generally, but rather that I expect far more power and consistency than they provide. A great example is this: if you’re writing a VNC application (as I am), you need a way to handle all keystrokes to the application and send them over the wire as ASCII or special X11 key symbols. This is easy enough on win32, using the MapVirtualKey function, which allows for a layout-independent way to take a key sequence (e.g. shift-5 for % on US keyboards) and turn it into a character.

There’s no such equivalent in UWP, so there’s absolutely no way to handle this without processing keyboard layouts yourself. Moreover, there doesn’t seem to be any way to get the current layout, so you can’t know what the user is using at the time. This severely limits the capabilities of app developers. Microsoft’s own Remote Desktop application for UWP seems to get around this, but I have a strong suspicion that they’re just calling the native MapVirtualKey API – something us independent developers can’t do without violating the rules of the Microsoft Store. I hope that I’m wrong on this one, but I’m almost certain I’m not.

And this brings me to the real issue with HoloLens as it stands now: there are no apps. Of course that’s slightly hyperbolic, but only slightly; on a scale of 1 to Windows, this ranks somewhere around BeOS. Of the apps I’ve installed on my device, only two come from sources other than Microsoft itself, and they’re both just toys (albeit cool ones, e.g. https://www.youtube.com/watch?v=JPMUuaeyy0g). There’s no Facebook, no VNC client, no Discord, no Slack, no … anything, really.

The apps I find myself using most? Microsoft Edge and Remote Desktop. Edge works great, which I never thought I’d say. I often have a couple windows of documentation up, along with my Windows PC up in Remote Desktop. It’s a cool experience to see VS floating in front of you, and push code to your HoloLens right as you’re wearing it. I’ve developed about half of my VNC client while sitting in bed, a virtual office surrounding me. Now that I have that mostly working (albeit not in a release-ready state), I’m able to connect to my Mac and do my day job 100% from HoloLens; the next stage of my nerd evolution.

The most astonishing thing to me is that the holograms retain their fidelity no matter how you look at them, with one tiny exception. I can have a window on the other side of my living room and the text and images are 100% perfectly crisp and focused such that your eyes see them as absolutely normal. I’m still not sure how they pulled this off, but it’s truly something to behold.

The one visual fidelity exception is something I expect they’ll fix shortly. Windows in the HoloLens aren’t 2d – they’re 3d boxes that have a vertical stripe texture on their sides, and a flat shaded back. This stripe texture looks great if you’re looking at it mostly from the side, but if you’re looking at the window and aren’t perfectly aligned, you’ll see essentially a marching ants effect. I expect this will be an easy fix, as they can either make the back of the box slightly smaller than the front (thus causing the sides to angle away from your point of view), or simply only show the stripe texture if your angle if incidence for your eye is above a certain level.

From a comfort perspective, the HoloLens is good, but not great. Wearing it for up to 4 hours tends to be just fine, but the adjustable band tends to dig into my forehead after that point, and I’m left with a subtle headache. I imagine that future generations will change the balance and reduce the weight, which should increase comfort. I think I’m going to experiment with adding some extra padding in the meantime, but I have a feeling it’s going to have very little effect.

But the reason I’m concerned with comfort is simple: I’m ditching all my physical screens. For day job work I’ll VNC into my Macbook (which will sit tucked away somewhere) and everything else I’ll do through native HoloLens apps and RDP. I’m not quite ready for this transition yet, but I plan to make it in the next month or so. Primary holdouts: my VNC client needs compression (sending raw streams across the network is a bit too laggy (albeit not terrible!) and is probably the cause of the battery drain I’m seeing); the Bluetooth keyboard I’m using right now is fairly bad and the mouse I’m using is abysmal; and frankly, it’s scary. I’ve spent nearly my entire life tethered to some form of a traditional computer; whether a desktop and a CRT or a laptop with its fancy IPS panel, computers have been a thing that I had to actively use.

HoloLens changes all of that. With it, a computer is something that bends to you, not the other way around. When I walk into my kitchen, I see Groove Music and an Edge window that’s already loaded with recipes. When I walk into my office, I see documentation and other developer goodies. When I walk into my living room, I see the multitude of decorations that my fiancée and I have put together, along with a bunch of game launchers. After all, what is a living room rug for, if not a resting place for holographic tigers?

It’s not perfect. It’s damn far from it, and it’s even further from a price point that is palatable for most developers, let alone consumers. But in 5-10 years, this will become the true desktop killer. Forget phones, forget tablets; this is it. This is an entertainment device (Fragments gave me my first legitimate scare from any VR/AR experience ever), it’s a time killing device (Baconit for Reddit is a good start!), it’s a productivity device, it’s… whatever you want it to be. It gives you all the options without the compromises, at least in theory.

I can’t believe that I’m saying this: Microsoft has showed me the future, and it looks glorious. Please, please, please Microsoft, don’t screw it up now. If there is no HoloLens 2, there’s no justice in this world.


Now read this

A Stupidly Simple, Fast Octree Traversal Algorithm for Ray Intersection

I’ve been doing some game dev stuff lately and I needed to intersect a ray with an octree of triangles, for collision detection. I first implemented a naive algorithm that simply checked if the AABB of each octant intersected the ray,... Continue →