Poking through my hard-drive earlier looking for inspiration for a VR demo I’m working on, came across a nice SF texture set put together by Philip Klevestav.
The copy of the textures I had was in Doom3/Quake4 format so I spent a couple of hours setting them up in Unity using the Standard Shader. Since the original source files were shared under the Creative Commons Attribution 3.0 Unported License I figured it’s only fair I share the Unity friendly material files.
If not for the fact that phrase is synonymous with a certain show about a mad man and his box, that would actually make a pretty great marketing slogan for a VR headset.
Have wanted to work on this project for a while but didn’t while I was focusing on mobile VR stuff, since it really needs the positional tracking of a Rift or Vive to let you appreciate the scale weirdness of a room that’s smaller on the outside. Hopefully upload a build of this in the next week.
1st August 2016 edit: Haven’t had as much time as I would have liked in the last few days to work on this, what time I have had has been spent doing texture and lighting tests.
The failed alliteration of that title bugs me. That’s 2.40am for you though. Since it is so late this will be brief, after a productive few weeks I figured I should jot some notes down.
Cockpits seem to have a sweet spot of scale when it comes to helping ground the player and reducing simulation sickness. Too big and the illusion of being inside a cockpit is gone. Too small and there is a rapidly increasing sense of discomfort from the obvious lack of head positional tracking. When a control panel is a perceived reasonable distance away you’re less likely to try and lean in. Put it close and you instinctively try to lean in to get a better look. That’s obviously no longer an issue with higher end pc headsets from DK2 up, but on mobile VR like cardboard or the Gear VR it is very unsettling to feel like the console is receding away from you as you try to read it.
The Note 4 can do more than I expected at 60fps. Colour me impressed, haven’t even tried playing with the different power scale settings yet.
Speaking of impressed, a Gear VR test build with the Virtual Texture Scale set to 4 looking STUNNING. I mean sure it only ran at a couple of frames per second, but those two frames a second had the crispest darn text I’ve ever seen in VR. Putting settings back to default so the project would run at full speed was painful because I realised lots of visual issues I’ve been chalking up to the Note 4 screen resolution are actually just due to not having the processing power to do it justice.
Yelling DRADIS CONTACT to myself while turning to face a just appeared enemy ship will never stop being fun. That too could just be the 2.40 am though.
I doubt there’s anyone over the age of 25 in Adelaide who doesn’t still look up whenever they are in the Myer Centre without half a hope of seeing the blue Jazz Junction tracks suspended overhead.
Of course they aren’t anymore. The Myer Centre was a product of late 1980’s excess, and Dazzeland was the cherry on the one billion dollar cake. The South Australian State Bank collapsed with their investment in the Myer Centre as a major contributing factor, the South Australian economy took a dive it has never fully recovered from, and after a few years limping along Dazzeland quietly closed in the late 90’s.
By all rights Dazzeland should have never existed, the state as a whole would have been better off had it never existed, but damn there is something cool about a rollercoaster in a shopping centre. I would love to ride it again, but there’s no way in the world that will ever happen.
Well no way in the real world.
Luckily, nowadays, the real world isn’t the only one we can visit.
I received my Gear VR Innovator Edition (a fancy way of them saying “expensive and not much content yet”) a few months ago, and snarky comments aside it is an astounding piece of kit. I’ll write up more about it in its own post but the VR experiences you can have entirely running off your mobile phone are surprisingly immersive.
Keen to start working on my own VR content I was also hesitant based on the performance limits that come with mobile development. The Note 4 carries a 2560*1440 screen and if you start dropping below the 60 frames-per-second the Gear VR demands your end users aren’t going to have a fun time at all. At the time I was also using the free version of Unity 4 which had great VR support, but the essential profiling tools were locked away in the Pro version.
Any complicated project was likely to become an optimisation headache, especially since this would also be my first time building any project on the Note 4. For that reason I decided to focus on something that would be computationally light, no fancy game logic or AI. Just a basic scene that would allow me to keep on pushing in detail until I discovered the bounds of the art budget I was dealing with.
So it was that I ended up deciding to build a rollercoaster. I was aware going into this that there weren’t any rollercoaster apps on the Gear VR for a good reason. It’s really easy to make people sick with poorly designed VR and the lack of positional tracking, relatively low frame rate (the Rift DK2 for example runs at 75fps), and mobile processing limitations certainly wouldn’t help in developing a comfortable experience.
The motion sickness issues didn’t bother me too much. I spent the past three years studying in a field which involved a fair bit of work on conflicts between the visual and vestibular systems, a project that induced motion sickness would make a useful test-bed for testing out potential solutions to the issue, or at least figuring out where the tolerable limits lie. Better to work them out for myself now than down the road in a more complicated project.
So a rollercoaster, and for art budget reasons I wanted it to be in a relatively contained area. Once those rules were in place the decision practically made itself.
I was going to Dazzeland.
I spent a day trawling the internet for resources. A handful of videos and some photographs, but detailed information on the former park (and specifically the Jazz Junction coaster) was surprisingly sparse. There was no reason I needed to make things realistic, but one of the amazing potentials of VR is the ability to virtually visit real locations and I figured that nostalgia kick would help get people past any technical limitations of the project. After a couple of failed attempts to sketch out the coasters path I grabbed my camera and headed up to top floors of the Myer Centre myself to see what hints of the former amusement park remained.
It might look like a low-rent Apple Store nowadays, but look closely at the pillars supporting the ceiling and you can still see the remnants of the coaster. Fortunately for my purposes the support mounts must have been too difficult to remove so they were left in place.
Makes sense, not like there are many people up there to see them anyway.
Those mounts were the missing piece that quickly allowed me to plot out the path Jazz Junction had taken, with reference to photographs from the time and quick glimpse videos like the one at the top of this post. Things still weren’t 100% accurate, but good enough for my purposes.
With the coaster track in place I started blocking out the centre around it.
Things were starting to come along nicely, and at this point I was able to start running the environment in VR with a decent idea of what the finished product would feel like. Performance was silky smooth. At this point adding lights and breaking up geometry to fit textures could quickly impact the performance, so I decided to take advantage of the Note 4’s decent texture memory and put the entire environment into one texture atlas. I gradually increased the size until I had a 4096*4096 texture covering the entire model without performance dipping. That made things a lot more flexible, with the ability to uniquely texture the entire thing I could go as crazy as I wanted in regard to lighting and shopfronts.
It also meant I didn’t have to worry about things looking too different between the modelling package and running in Unity.
Around this time I also got the coaster movement happening. I tentatively loaded the application onto my phone, slipped the Gear VR over my eyes and sat down to be the first person in 17 years to ride the Dazzeland coaster.
30 seconds later, I was the first person in 17 years to have been left feeling ill by the Dazzeland coaster.
Really ill. This wasn’t the ”oh I should have a five minute break and a glass of water” queasiness, this was the full on ”it’s twenty minutes later and my head hurts” motion sickness. Oh well, at least I had the don’t do any of these things benchmark I was looking for. It was really a worst case scenario the way I set things up, so it could only get better as I introduced features to mitigate motion sickness.
I had no carriage yet, so was floating above the tracks with no visible support. The motion had been animated to include acceleration and slowing down along the path, another big motion sickness trigger. Finally I got so engrossed in the experience that I started looking around in all directions while speeding along – another big no-no.
It was a shame to get rid of the more realistic motion, but that had to be the first thing to go. The human vestibular system is interesting in that we can’t actually detect movement in a constant direction. What we detect is acceleration. So you have to make trade offs between what your mind says is realistic, and the conflict that your senses have with that ‘realism’. In this case, it seems like it would make the experience more realistic to have all the realistic acceleration you experience on a rollercoaster. Watching a video on a monitor that will definitely be the case, however once you are experiencing that in virtual reality your vestibular system will protest. I can see constant acceleration but can’t feel anything it will scream at you, wtf is going on?
Once I had recovered from the first trial I changed a setting so speed would be constant (luckily the Curvy plugin I was using for this project made that easy) and gave it another go.
A lot better this time. The realism definitely took a dive due to the movement feeling really artificial, but I felt a lot less conflict between what I was seeing and feeling. The corners were still a problem but there isn’t much to be done about that, you can’t make jump cuts between directions on a rollercoaster.
The sensation of flying was still a problem, so I knocked up a rough carriage and sat the camera inside that. Not unsurprisingly that gave a big improvement as well. It’s the same principle as looking to the horizon when you feel sea sick on a boat, it’s good to have something in your view that moves in the way your non-visual senses are experiencing.
I did a few tweaks on the path to eliminate little jerks, and straightened out curves in longer stretches to be straight where possible. The thing was kind of fun now. I trained myself in the best way to ride it, where it was safe to look around, and where it was best to stay staring straight forward. Around this point I let a few other people try it out. Interestingly the feedback was fairly consistent. I’d give the headset to someone with the instructions to keep the cart in view and not look around too much, they would put it on and say “oh, this isn’t too bad”, followed a few seconds later by them getting over-comfortable, spinning their head around and promptly needing to take a break.
On a couple of occasions that need to take a break would be accompanied by swearing, which isn’t ever the best sign.
While I continued to make tweaks to the experience and tested different speeds and track angles (I had an idea that giving more bank to the corners so the acceleration your body expects is in the same direction as real world gravity might help) I was starting to feel guilty about using my friends and co-workers as guinea pigs, so decided to lock the experience side down and take what I’d learned to my next project. I continued working on the art side, intending to continue adding props and decorations until I reached the performance limit but that fell by the wayside with the arrival of the Mobile Jam and starting a new job.
So Dazzeland sits dormant again. Not dead anymore however, just waiting. I’m really interested about how a higher frame rate and positional tracking will improve the experience so intend to revisit the project once I have a Vive or CV1 in my hands. As it is though the cramped small track means it might never feel fully comfortable in VR.
I hope it will though. I’d like to ride Jazz Junction again.