mastodon | itch.io
Untethered Index Headset
Okay, so this project ended up being a bit over-the-top. I was getting impatient waiting for a wireless adapter to be released for my Index VR headset and wanted to see what could be done about the cable tether. I could have taken the easy way out and bought a standalone VR headset but I'd gotten used to the high-end specifications of the Index and I wasn't comfortable supporting anything from Facebook.
After getting an Index system set up in a garage I immediately ran into the problem of the headset cable restricting my movements in the far corners of the play area. Extending the tether with another cable and a DisplayPort signal booster helped but that meant the slack was often underfoot when I was closer to the computer. Turning was still limited as well with the cable frequently becoming wound around me. Overall I enjoyed using the Index but the cable was a continuous annoyance and presence breaker. After making many small adjustments hoping I could work around the issue I finally just decided I was done with tethered VR and started thinking about how I could free my Index.
image - VR backpack Photo of rear view of VR backpack in garage showing ports on back of computer. Large power station is underneath mounted PC. Cable runs from backpack to Index headset on right.
I should mention that HTC does actually make wireless adapters but they're only for Vive headsets and I didn't want to buy an older HMD with lower specifications or deal with the tracking issues of the Cosmos. I would also have needed to get a motherboard with an additional PCI-e 3.0 slot for the wireless card and there may have been signal issues if I wandered too far from my computer. Powering just a headset and wireless adapter would be more sensible for most situations because of the longer possible play time and lower weight but for now using a wearable PC/laptop is pretty much the only way to get an Index headset working without a tether.
I did also initially think about using a laptop but gaming models with DisplayPorts are expensive for the performance and can't really be upgraded. Keeping the laptop from thermal throttling or overheating me while it was against my torso was a concern as well. HP and a few other companies do actually make backpack PCs specifically for VR however they were expensive too and I figured I could make something as capable but cheaper if I put it together myself. Knowing that I might be able to use the single fan RTX 2060 I already had kept me leaning in that direction.
The next problem was finding a very small PC case that could still accomodate a discrete video card. Mini-ITX cases are generally small enough to go under your desk but aren't something you'd want on your back. Fortunately I came across some tiny console-style PC cases with very low overall volumes. They actually had enough room for my 2060 so I decided to give one a try. Getting a power supply unit that fit inside the case took awhile. The case is so small that even SFX PSUs wouldn't do but I finally acquired an ENP-7660B which sits snugly. To turn the little PC into a wearable device I used a hiking frame with plenty of mounting points. I secured both the PC and a big battery pack using cargo straps and tightly bundled the long HMD cable to the frame.
image - VR backpack Rear, low, diagonal view of VR backpack made out of a hiking frame with harness, mini-ITX PC, and portable power station for battery power. Index headset is closer to camera, resting on a book.
The PC is mounted in a 'shark fin' orientation on the frame to ensure adequate cooling of the CPU and GPU. I've been leaving the side panels off to further reduce thermal build-up and I added a mesh tray between the case and frame to let heat escape so I can stay cooler. The 160 watt RTX 2060 lets me run many applications at 144fps but doesn't require anywhere near as much power as a 30 Series GPU.
The battery pack is a 400W lithium-ion portable power station made for solar panels and charging devices while camping. The power station is the heaviest part of the VR backpack but I mounted it low to reduce back strain. It has standard wall-style outlets which I use for the PC and headset. Powering the computer with a DC-DC PSU would increase efficiency so that's something I could look into. Modifying a laptop to use a bigger battery might be more elegant and also worth a try.
One small quirk, I noticed if I run SteamVR and then unplug the monitor the game library launch icons will not appear in VR. I've just been unplugging USB and video cables first, turning the Index controllers on which launches SteamVR, and then everything works as usual. I could probably set up something more sophisticated with wireless streaming of the HMD view to a monitor and desktop access available within VR but haven't gotten around to it.
The power station's batteries last 1-2 hours depending on the application, resolution scaling, and headset Hz setting. My back and shoulders sometimes feel a bit sore if I play something that requires a lot of arm movement but overall the backpack's weight isn't very noticeable provided the straps are cinched tight. To me the minor inconveniences of this setup are easily outweighed by the freedom I get from not dealing with the headset cable.
I've played through all of Half-Life: Alyx with the backpack and naturally walking around virtual rooms and ducking between cover points without tugging or tripping on a cable is wonderful. I feel so much more present in VR environments when I can explore a space by taking several real world steps at a time, this is a feeling that simply cannot be replicated by artificial thumbstick-based locomotion. The setup also makes awkward in-game snap turning unnecessary. My movement is less restricted now so when I play action games I have my chaperone bounds appear when I'm about 1.5m from the walls for additional safety.
image - VR backpack Rear diagonal view of VR backpack and Index headset. Camera angle is tilted roughly 45 degrees to right.
The space I'm currently using is 5m x 5m which is already fun to freely move around in but of course now I want to try the backpack in an even larger play area. I could technically use the Index in a 10m x 10m space but temporarily setting up and then taking down multiple base stations at gyms or tennis courts, assuming they even had outlets in every corner, is not appealing. Fortunately, the HP Reverb G2 does not need base stations for positional tracking so I'm thinking about using that headset for 'sports court' or 'warehouse scale' VR. As far as I know Space Pirate Arena is currently the only VR game (other than bespoke applications for arcades/LBE) that requires such a large play area but I think almost every VR application will be more enjoyable when I get the chance to use a 10m x 10m or larger space. I'm certainly looking forward to taking a proper stroll through City 17 for example.
If wireless PC VR headsets become common I could retire my VR backpack but I'm pleased with what I came up with and it has convinced me that I will not go back to tethered VR. Wireless hardware for the Index or Reverb G2 has not been announced and it would have signal range limitations so for now I might just try to extend the backpack's play time and reduce its weight. Using lower watt PC components, lighter batteries, and a DC-DC PSU could improve the current setup. Another note, after making the backpack I realized some of the less expensive laptops without DisplayPorts have USB-C ports that could work as DisplayPorts using adapters. Of course the GPUs in more affordable laptops might have trouble running VR applications at 144fps for the Index or 90fps at the G2's resolution.
One other route for anyone interested: I was reluctant to consider the HP Z backpacks because of their high prices but I have started noticing older models showing up as 'used/refurbished' for much less than the top-of-the-line models. A 7th-gen Intel processor and Nvidia P5200 ('1080-class') GPU would be fine for plenty of VR applications. The HP backpacks use laptop-style components along with small external auxiliary batteries so they should be about half the weight of my setup and I think the play time would be similar.
I have been enjoying the Index without the tether but putting on a backpack, even a lighter one, is an extra step that increases the already significant friction of entering virtual reality. Now that standalone headsets are becoming more capable I do think every PC VR headset should just have integrated wireless hardware or at least an optional wireless adapter available. Cables are okay for virtual cockpit games but I don't think PC VR, even with the higher fidelity visuals, will seriously compete with standalone VR in the long run unless the tether problem is largely solved.
It's not yet clear how Valve and other companies making PC VR systems will respond to the release of increasingly higher-spec untethered standalone hardware. I assume the bandwidth problems of wirelessly getting 4k-squared pixels per eye to a headset at 90, 120, or 240 frames per second will not be trivial of course, rendering and compression based on eye tracking could help there. Standalone will remain the most popular way to experience VR however I don't think Facebook dominating the medium in the long run is acceptable so I'm hoping to see better companies making compelling standalone devices. For now I'm okay with swimming against the tide and sticking with PC VR.
image - VR backpack VR backpack PC with Index, front diagonal view from farther away looking down. Padded harness straps are shown.
My next step will be to try a G2 headset with my VR backpack and I intend to do a follow-up post after using the setup in a much larger play area. I'm not expecting a holodeck but I do think it will be closer to that sci-fi dream than anything I've used so far.
This project was inspired by portable computers of the 1980s. I always liked the sturdy feel and bold shapes of those old machines. I also wanted a computer with a mechanical keyboard but laptops which feature those keyboards tend to be rare and pricey. While it is possible to take a common laptop and a mechanical keyboard on the go it's more awkward than a standalone device so I decided to create a custom case and assemble my own portable.
I had been collecting components for the project for awhile but only recently made the model for the case when I found out a nearby library offered low-cost 3D printing. When their MakerBot had trouble printing I decided to reduce the model's size in case I needed to build it on a printer with a smaller volume. This also made it cheaper and faster to print because it needed less filament and movement of the print head. The case can now just barely fit into the print volume of a LulzBot Mini 2 (160mm x 160mm x 180mm).
image - thetradek mesh 3D model of custom computer case made for a keyboard, battery-powered pi, and small display
The case's smaller size makes the keyboard hang off the sides quite a bit but it doesn't rock during typing. I also added some gripping pads to the bottom of the case to keep it from sliding. The keyboard is a KBParadise V60 GTR Front Print 60% from mechanicalkeyboards.com. I went with Gateron Clear switches but there are several options for similar models. Pretty much everything else is from Adafruit:
Once I was done modeling the case in Blender I exported it as .stl for printing. Everything ended up fitting pretty well although I'd make a few changes to the model before I print it out again. Overall I'm happy with the way the project turned out and I've been enjoying my little deck.
3D Modeling with Blender
This guide is for anyone new to 3D modeling or for those coming to Blender from another application who want to know more about its menus and shortcuts. Note: I wrote this before Blender's major UI overhaul so some things may be out of date.
My basic workflow for making a hard-surface game asset in Blender is to start with a primitive such as a cube, enter Edit Mode, extrude faces and create edge loops, then adjust the smooth angle to get crisp shading on edges. For an organic model I may also subdivide the object, sculpt details, and decimate to reduce the triangle count while preserving key features. You can also use Edit Mode to hand-optimize your mesh by getting rid of redundant faces, edges, and vertices. Edges can be manually marked as smooth or sharp as well. Experiment to find what's best for each model. Right then, on with the guide...
Object Mode and Edit Mode
While in Object Mode you can click Add at the bottom left of the screen (left of Object Mode button) and then click Mesh to pick a new primitive to add to the 3D scene. Once it appears, right click on the object to select it. This will bring up the XYZ arrows which you can click on and drag to move the object. You can also press the S key to scale and R key to rotate. Confirm scaling and rotation operations with left clicks. Once you are happy with the placement and scale of the new object you can enter Edit Mode to move its faces, edges, and vertices. To get into Edit Mode make sure the object is selected then click the Object Mode button and select Edit Mode. You can also just press the TAB key. Note: If you add meshes while in Edit Mode they will become part of the object currently being edited.
If you see blue faces they may be facing the wrong way. At the bottom left of the Blender UI next to Object Mode: click Mesh > Normals > Flip Normals to flip the normals of the currently selected faces.
With two or more objects selected in Object Mode, click Object > Join to join the objects together. They can then be edited as a single mesh in Edit Mode. You can also use CTRL-J to do this. Note: The pivot point of the joined object will be that of the last object selected before joining.
While modeling you may find that your mesh is not where you want it to be relative to your object's pivot point or the center of the 3D scene. If this happens enter Object Mode then press SHIFT-S and snap cursor to center. Select your object, press SHIFT-S and snap to cursor. Enter Edit Mode, select all, then translate everything until you are happy with the placement relative to the pivot point.
Keyboard Shortcuts (Object Mode and Edit Mode):
TAB, toggle between modes
CTRL-TAB, switch between editing faces, edges, or vertices
Z, toggle between wire frame and solid view
SHIFT (hold) + RIGHT CLICK, select multiple
A, select everything, or deselect
CTRL-I, invert selection
SHIFT-D, duplicate selection
C, circle select - Mouse wheel changes circle size, left click and drag selects, middle click and drag deselects, and right click exits.
B, box select - Left click and drag to select, middle click and drag to deselect, and right click to exit.
S, scale selected - use X, Y, or Z keys to select axis - Try moving the mouse cursor closer or farther from center of scaling before pressing S to change scaling rate.
R, rotate selected - use X, Y, or Z keys to select the axis
RIGHT CLICK, cancel the current translate, scale, or rotate operation
CTRL (hold), perform large snaps during translate/scale/rotate
SHIFT (hold), allow for fine translate/scale/rotate
X, delete selected
SHIFT-S, bring up snap options for moving selection to cursor or vice versa
Keyboard Shortcuts (Edit Mode Only):
CTRL-L - Select all faces, edges, or vertices that are connected to the current selection.
F, add face between two selected edges - It will also make a face between three or more vertices or make an edge between two selected vertices.
E, extrude selection
CTRL-R, make an edge loop - mouse wheel up or down to change number of loops - LEFT CLICK to confirm.
ALT (hold) + RIGHT CLICK, select an edge loop - You can also use this command to select face loops or vertex loops depending on what mode you are in.
ALT (hold) + SHIFT (hold) + RIGHT CLICK, select multiple edge loops. Delete selected edge loops by pressing X > G.
ALT-M, merge currently selected into a single vertex
Remember to save or export the low-resolution version of your mesh before you add a subdivision modifier.
While in Object Mode: On the right side of Blender UI click Modifier tab (wrench icon), click Add Modifier, and then click Subdivision Surface. Under Subdivisions change the View number. Note the changes in Tris at the top of the Blender UI. You can also press Z to see the wire frame view. You can switch to Edit Mode and make changes to the low-resolution mesh before you Apply the modifier. Once you've applied the modifier you can change to Sculpt Mode to refine the mesh and add details using Grab and SculptDraw.
Symmetrical editing along the X-axis is on by default. While in Sculpt Mode within Tools menu (left side of the Blender UI), click Symmetry/Lock, then click X in Mirror menu to turn off symmetrical editing.
Under the Brush drop down menu change Strength to make the SculptDraw tool have more or less of an effect.
Change the brush shape under Curve drop down menu to draw or grab with round, flat, or pointed curves.
Be careful with scaling. Non-uniform scaling will affect sculpting. Scale an object the same amount along each axis if you are going to sculpt the mesh later. This only matters if scaling in Object Mode. You can do non-uniform scaling in Edit Mode without sculpting issues later.
Keyboard Shortcuts (Sculpt Mode):
G, Grab mode
X, SculptDraw mode
[ or ], change tool radius
SHIFT, hold while left click dragging to smooth
Be sure to save or export the high-resolution version of your mesh before applying a decimation modifier.
Once you've subdivided and sculpted a mesh you may want to reduce its triangle count for better rendering performance or a smaller memory footprint. On the right side of Blender UI in the Properties menu, click Modifiers tab (wrench icon), Add Modifier, and then Decimation. Click and drag Ratio to change the decimation amount. Click Apply to confirm application of the modifier. You can now edit the new mesh in Edit Mode. The mesh may no longer be suitable for animation but a decimated model is often fine to use if the object is static.
You can change the smooth angle of mesh edges to make them appear more crisp, this may give a better look for rocky surfaces or mechanical objects especially if they are low-resolution. On the left side of the Blender UI in the Tools tab > Edit drop down menu, click the Smooth button under Shading. On the right side of the Blender UI within the Properties menu select the Data tab (triangle icon) and then check Auto Smooth in the Normals drop down menu. Then change the Angle to get the desired look for your mesh.
If you imported an object and want to change smoothing but Smooth Angle is greyed out: Click Clear Custom Split Normals Data in the Geometry Data drop down menu. Then switch to Edit Mode, select all, and use CTRL-E > H to clear sharp edges. You should then be able to freely adjust the Auto Smooth Angle in the Normals drop down menu.
Keyboard Shortcuts (Edit Mode):
CTRL-E > K, mark sharp
CTRL-E > H, clear sharp
Misc Camera UI
By default Blender will start in the 3D View. That's all we care about for 3D modeling. Toggle between perspective and orthographic projection with View > View Persp/Ortho.
For more predictable camera rotation:
File > User Preferences > Interface > check 'Rotate Around Selection' - Remember to save preferences at the bottom of the window if you want that camera behavior every time you run Blender. The camera will now rotate around the currently selected or last selected object, face, edge, or vertex.
If movement of the camera with the mouse wheel becomes stuck or extremely slow after moving the camera closer, use View > View All to reset.
MOUSE WHEEL moves view in or out
MIDDLE CLICK and drag rotates the view
SHIFT + MIDDLE CLICK and drag pans the view
CTRL (hold) + MIDDLE CLICK (hold) - drag for fine camera movement
SHIFT-CTRL (hold) + MIDDLE CLICK (hold) - drag for faster movement
SHIFT-F, enter WASD movement mode - Left click will confirm camera placement, right click cancels. Hold SHIFT while moving camera with WASD keys to increase speed. Press TAB to turn on gravity for walking on mesh surfaces.
SHIFT-F > LEFT CLICK can also be used to quickly switch from orthographic mode to perspective mode.
Q or E, move view up or down while in WASD movement mode
N, displays the View Properties - You can change the near clipping plane distance from the View drop down menu. Look for the Clip: Start: field and enter something like .02 to keep the near plane from clipping your mesh when you move the camera close to it.
I created a new short horror game for Vive. The thought was to refine the low-light look of 'The Folded Castle' while reducing the space needed for navigation. Settling on a 2.5m x 2.5m play area seemed like the right compromise to let players move through the environment naturally while not forcing them to rearrange their living rooms. The wall meshes were positioned so the player can safely switch to Developer Chaperone style with low bounds opacity for better visual presentation.
Early tests of the dark rooms made me decide to add rear-facing glare on the player's lantern to hide the Vive's panel grain. That had the bonus effect of making the lantern easier to find if dropped by the player. The angle of the lantern light was also narrowed and the creature forms were kept very vague. The spot light cookie, dust, and bugs were added to give the scene visual depth and believability. The overall aim was to keep information somewhat limited, making the player listen carefully and use her imagination. Lastly, I wanted to create a longer experience than my earlier prototypes so I made a simple puzzle for the player to solve.
This was a good exercise in learning more about the Unity editor and C# scripting, I hope you enjoy it. Download Ruin's Hold on itch.io.
Here's my latest VR scene, this one was inspired by early 3D graphics. The goal was to make a VR experience that would run well on PCs that are far below the minimum specification for the Vive. This also allows newer GPUs to run the scene with increased supersampling for crisp visuals. I think the result looks pretty good and I'm excited to start targeting standalone headsets as they hit the market. Take a moment to explore and interact with the scene: launch
The Folded Castle
Here's a new short VR experience with a horror theme. The concept is to allow the user to explore multiple locations without teleportation controls or jarring transitions. There's also a new batch of meshes included to use in your own projects. Take a look at the .obj files and see if you get some ideas.
The Folded Castle
Here's a small VR scene. I wanted to try a different relocation system and play with a faceted look. It should run on PCs below the minimum specification for the Vive so give it a try even if you have an older setup.
I'm making the models I used for this project available for free. There are also a lot of meshes that didn't end up in the final version so take a look and see if there's something you can use. The models are .obj and scaled for direct import into VR scenes. You're welcome to use them for your own prototypes or full games.
Virtual Reality and Art Direction
updates - 2018/4/8, 2018/2/28, 2017/6/7, 2016/10/26
Three major virtual reality headsets have been released and I've been thinking about various approaches for art creation in this emerging (re-emerging?) medium. While there has been a push to market 'VR-ready' PCs to consumers I believe an interesting and ultimately more sustainable approach is for developers to creatively limit themselves and succeed through art direction. Here are a few of my thoughts along those lines.
VR development is still in an experimental phase but there is no doubt that high frame rate is critical for comfortable VR experiences. While the cost of high-end PCs needed for rendering realistic scenes at 90+ frames per second is coming down it will remain an adoption barrier for many users. However, low-cost, standalone VR headsets with positional tracking are becoming available. The trade-off is that such systems do not allow for extremely realistic visuals. Despite that, I believe such hardware will attract a larger number of users due to the lower price, ease of setup, and portability compared to desktop VR. Wireless video transmission solutions which allow for untethered play are making desktop-based VR more appealing but the cost and setup hassle remains. A standalone headset, executed properly, will allow a user to simply turn the device on and start experiencing VR.
I propose that developers alter their approach to creating VR applications by making use of stylized artwork to target these standalone headsets. Thoughtful and consistent art direction can provide the bulk of a game's visual appeal, making efforts towards photorealism unnecessary. It may help to look at older games to see how developers creatively overcame hardware limitations. Asset creators and programmers working on Gamecube and Playstation 2 consoles made the most of reduced triangle counts, low resolution textures, and a handful of visual effects to deliver compelling experiences, often at a rock-solid 60 frames per second.
Virtual scenes may be easier to read without extra details because bold and uncluttered shapes can help with navigation and interactive object identification. Polygonal edges, contrast, and shading gradients are often enough to draw a user's gaze to important points within her view. Users are also likely to immediately understand the function of an iconic object with an abbreviated outline so items with additional ornamentation may not be needed. Sticking to stylized visuals throughout the development process can also boost the production speed of a project. This is especially important for VR because many prototypes will have to be discarded as teams learn what works best in an uncertain medium.
Another thing to consider is that the more visually realistic a world is the more the user will be distracted by unusual behavior (e.g. AI glitches, collision errors). Even if you take care to prevent such occurrences, you are better off not presenting your world as strictly realistic in the first place. VR is also a potential uncanny valley amplifier. Ultra-realistic yet slightly wrong looking human characters already make some users uncomfortable when viewed on traditional displays. Seeing similar characters at close range in three dimensions is likely to be disturbing. The creation of low-poly, stylized characters sidesteps this issue. VR users are now embracing simplified hand models as well, often preferring them over detailed and specific hands that jar with expectations of a virtual self.
Standalone headsets will have storage capabilities similar to tablets and other mobile devices so it's also worth thinking about appropriate download sizes. Lean applications may have a better chance of being downloaded in the first place and may be less likely to be removed when the user is approaching the storage limit of her device. Prioritizing standalone from the start of development also eases porting because any assets intended for a mobile GPU should be trivial to render with a full graphics card. The same can't be said if transitioning a project from PC to mobile and painful content cutting could be required.
Lastly, a user may actually enjoy looking at a virtual environment more if it's kept visually vague. Painters often leave some areas of a composition just loosely textured to let a viewer's gaze rest and make the features of foreground objects feel more prominent. Distant forms rendered as mere suggestions can also make an observer more curious. Applying such approaches to game asset creation could both reduce hardware requirements and better engage your user's imagination and desire for exploration.
Developers are still learning how to make intuitive and enjoyable virtual reality experiences. What is known is that high frame rate is critical for user comfort and stylized art can provide performance benefits. These benefits allow a broader range of hardware to be considered VR-capable, making VR appealing to users who may not be willing to purchase high-end gaming PCs. The use of abbreviated and efficiently renderable assets can also increase production speed of new applications which fosters needed innovation within a nascent medium. Over time the language of virtual reality will solidify with solutions to interaction and art direction tailored to the medium. These are exciting times, I can't wait to see what you make!