mastodon | itch.io | spreadshirt
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.
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.
New VR Project
I received my Vive Focus developer kit and have been testing a new project on it. While standalone headsets are the priority I intend to release the project for the original Vive as well. The game is meant to be a slow-paced and relaxing experience focused on observation and puzzle solving. I want to keep the scope limited, with a world size larger than my previous projects but with an emphasis on several interactive features and items per room-scale platform. I'm having fun developing for a standalone headset with positional tracking. Being able to explore a virtual space without a tether is quite nice.
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 since 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 since 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 since 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!