I was recently fortunate enough to attend Unite 2015 in Boston. I was even more fortunate to be one of the 300 or so developers there to score what Google was giving away at Unite – a Project Tango dev kit and a Durovis Dive 7 headset. Mobile VR with positional tracking is a pretty exciting prospect to me. More to come on that later.
For apps built on the Google Cardboard SDK, Google provides the concept of Viewer Profiles which are basically calibration settings for your headset. Based on your profile, apps built with the Cardboard SDK will tweak their rendering to give you the optimal VR viewing experience. Many Cardboard viewers now come with a QR code that is an embedded Viewer Profile for that particular viewer.
Unfortunately, Durovis doesn’t provide official Viewer Profiles for their Dive headsets. Maybe this is because they provide their own Dive SDK and they’re not interested in supporting a competing SDK. Regardless, I wanted to be able to have optimized rendering for my Dive with Cardboard apps, so I headed for Google’s Viewer Profile Generator.
The Profile Generator lets you input physical characteristics of your viewer and then spits out a QR code that you can then scan on your device using the Google Cardboard app. That lets your device know what kind of viewer is attached to it.
I thought this would be a pretty simple process. Just measure some stuff and be on my way. But the Dive took a little extra effort to get going.
First of all, the Dive is adjustable. So measurements like inter-lens distance and screen-to-lens distance are not constant. Based on my measurements, the Dive could have an inter-lens distance between 30mm and 68mm. The screen-to-lens distance could be anywhere from 49mm to 68mm. Google suggests you just use an average distance, but you could argue that you should use whatever setting is comfortable/works best for you.
I have the lenses at their maximum distance from the screen. Anything closer than that and the screen looks blurry to me. So, I used 68mm for the profile rather than an average.
I also found it difficult to get convergence unless the lenses were their maximum distance apart. Any closer and I started to see double. I also started to notice some chromatic aberration as the lenses were closer. So, I tried using the maximum inter-lens distance of 68mm in the profile generator. However, when I did that, the red dot in the generator’s test scene became impossible for me to focus on. So, even though 68mm is the correct physical measurement, I ended up using a value of 55mm where I could comfortably achieve convergence.
Next, I had to figure out the barrel distortion coefficients for the Dive lenses. The lens manufacturer could probably just give me those exact numbers, but it’s not something you can really measure yourself. So, if you don’t have those numbers, you need to view Google’s test scene on your device and then tweak the numbers until all the lines look straight and right angles look like right angles. It’s honestly pretty subjective and difficult to get “correct” values. The coefficients I ended up using seem pretty good to me.
Finally, I looked at the advanced settings – the lens FOV values. I wasn’t entirely sure what I was supposed to be measuring for this, but I assumed the FOV angles from the lens to the opening of the headset where I could see half of the screen. I measured a total of 60 degree horizontal FOV and 72 degree vertical FOV from a single lens. Assuming a more-or-less centered lens, that works out to values of 30 and 36 for those FOV fields. There is some documentation that notes that those values should be above 50 for most headsets. And that’s true for the smaller actual cardboard viewers made for phones. So, maybe the documentation just doesn’t account for viewers like the Dive 7. Regardless, the documentation says that those values were only used for a minor optimization. So, I ended up just leaving all these values at their default of 50.
And that was it. So, for those that want to skip the adventure I had (or start with a little more knowledge than I did going in), here are the values I used for my Dive 7 profile and a QR code of that profile:
- Button: Touch
- Screen to lens: 68mm
- Inter-lens: 55mm
- Alignment: Center
- Distortion k1: 0.40
- Distortion k2: -0.18
- Advanced FOV: All left at default of 50