improving
Thứ Năm, 29 tháng 10, 2015
Thứ Năm, 1 tháng 10, 2015
Unity 5.2.1: Three quick tips for improving the VR user experience
For demos that I work on, there are three simple things that I always do to create a better user experience:
If you are a regular reader of this blog, you know this isn't the first time I've covered these topics. However, now that Unity includes native VR support I wanted to revisit these tips and show how to do them with Unity 5.2.1, the 0.7 runtime, and the Oculus Utilities for Unity 0.1-beta package.
For now, I’ll just stress the importance of creating a profile in the documentation. If anyone knows how to get the current user name, please comment!
- make sure the Oculus health and safety warning (HSW) has been dismissed before any other information is displayed
- give the user the option to re-center their avatar after they’ve put the headset on and settled in a comfortable position
- encourage the user to create a profile
If you are a regular reader of this blog, you know this isn't the first time I've covered these topics. However, now that Unity includes native VR support I wanted to revisit these tips and show how to do them with Unity 5.2.1, the 0.7 runtime, and the Oculus Utilities for Unity 0.1-beta package.
Knowing when the HSW has been dismissed
The HSW is a big rectangle centered in front of the user. While it is semi-transparent, it blocks the user’s view significantly. For that reason, I like to make sure that is has been dismissed before displaying anything the user needs to interact with.
The Oculus Utilities for Unity 0.1-beta package provides a way to check to see if the HSW is still displayed:
OVRManager.isHSWDisplayed
This returns true when the HSW is displayed and false when it is not. Note that if you are running the application in the Editor, you won't see the HSW in the Editor window, however, the HSW will appear in the Rift view.
Re-centering the avatar
It is helpful to give users the option to re-center their virtual selves and this is one of the functions available as part of the Unity native VR implementation.
To re-center, add the VR name space and use:
Encouraging the user to create a profile
If the user has not created a profile, the user may experience discomfort because the default IPD or height is different from their own. In previous versions, you could get the name of the profile in use, and if the name returned was "default," you would know that the user had not created a profile. Unfortunately, I’m not seeing a way to do that with the Oculus Utilities for Unity 0.1-beta package. I tried using OVRManager.profile.username, but it returns "Oculus User" and not the name from the user profile. Looking at OVRProfile, it appears that only ipd, eyeHeight, and eyeDepth are retrieved from the current user profile (Note: you can get the user's eye height and IPD using .)
For now, I’ll just stress the importance of creating a profile in the documentation. If anyone knows how to get the current user name, please comment!
Nhãn:
eye height,
health and safety warning,
IPD,
native VR,
oculus,
oculus rift,
oculus utilities for unity 5,
player height,
UI,
unity,
usability,
virtual reality
Thứ Sáu, 11 tháng 9, 2015
Quick Look: Using Unity 5.2 native VR support to create a scene for the Rift
Unity 5.2 came out before I had time to write a 5.1 native VR post. With the book out, I can now get back to writing blog posts. Here's what happened when I took a look at using Unity 5.2 native VR support to create scenes for the Rift.
I downloaded Unity 5.2 and gave it a quick trial run with the DK2, the Oculus Runtime 0.7.0-beta, and the Oculus Utilities for Unity 5 0.1.0-beta package. As you might have guessed from the runtime version, this test was Windows only. To test it all out, I built a quick sample scene using assets found in the Unity standard asset packages, enabled native VR to get the scene on the Rift, added a player character, and then did a test build and run.
Enabling VR and getting the scene on the Rift
I used the same sample scene I’ve used in all my previous tests, a simple beach scene with a few palm trees created using assets from the Unity standard asset Environment package along with a single camera located at 0, 1, 0.
To run the scene on the Rift, I selected Edit > Project Settings > Player > Other Settings and made sure that Virtual Reality Supported was checked.
That done, with the Rift plugged in, I pressed Play in the Editor and was able to see the scene both in the Editor window and on the Rift (with the 0.7 runtime and Unity 5.2, direct mode works in the Editor). As I moved the headset around, I could see that head tracking was enabled and with the Rift on, I could look anywhere I wanted in the scene. Two differences to note between the Editor view and the Rift view: first, the Editor preview is monoscopic and does not include lens correction, and second, the Oculus Health and Safety warning is visible in the Rift view, but not visible in the Editor window.
With only a camera in the scene and no scripts for navigation, I couldn’t move anywhere. So, my next step was to add a player character.
Adding a player character to navigate the scene
The first option for quickly adding a player character I looked at was to use the first-person player character prefab from the Unity standard assets Characters package. After downloading this package, I simply dragged the FPSController prefab onto the scene and pressed play. This worked, but even though I've been using VR for a while and have my "VR Legs," I still found the default speeds for this controller fairly uncomfortable.
After a break, I took a look at a second option: using the first-person player character prefab (OVRPlayerController) found in the Oculus Utilities for Unity package. This package contains a variety of scripts and utilities that can be used to improve the VR experience (which I’ll be looking at in future posts) along with the first-person player character prefab.
The OVRPlayerController prefab from the Oculus Utilities for Unity package is a basic character controller that uses A, S, D, W controls. The default speeds were slower than the first option I tried and, for me, were much more comfortable to use. In addition, like versions of this prefab from the older integration package, it includes a menu of diagnostic information you can view by pressing the space bar.
The OVRPlayerController prefab from the Oculus Utilities for Unity package is a basic character controller that uses A, S, D, W controls. The default speeds were slower than the first option I tried and, for me, were much more comfortable to use. In addition, like versions of this prefab from the older integration package, it includes a menu of diagnostic information you can view by pressing the space bar.
Using this menu, I saw that I was easily getting 75 FPS for my sample scene. A good start. One issue I noticed though, was that while running the scene with the player prefab from the Oculus Utilities for Unity package, the console would sometimes be spammed with following error:
Quaternion To Matrix conversion failed because input Quaternion is invalid {0.000000, 0.000000, 0.000000, 0.000000} l=0.000000
UnityEngine.Matrix4x4:TRS(Vector3, Quaternion, Vector3)
OVRTrackerBounds:Update() (at Assets/OVR/Scripts/Util/OVRTrackerBounds.cs:151)
UnityEngine.Matrix4x4:TRS(Vector3, Quaternion, Vector3)
OVRTrackerBounds:Update() (at Assets/OVR/Scripts/Util/OVRTrackerBounds.cs:151)
Looking on the forums, this does not appear to be a serious issue, and word is it should be fixed in an upcoming release.
Now that I had a VR scene that I could navigate, the next step was to do a test build and run.
Building and running the test application
In previous versions, building a VR application resulted in two executables: <application>_DirectToRift.exe and <application>.exe. Now there is just one: <application>.exe.
I first tried just selecting File > Build Settings > Build and Run but this didn't work as the application failed to run. I then built the application and ran the executable by clicking on it and that worked fine.
Thứ Tư, 19 tháng 8, 2015
Code Liberation Foundation: Unity-3D UI with Oculus Rift (Lecture + Workshop) - Sept 5
I am excited to announce that I'll be teaching a class on Unity-3D UI and the Oculus Rift on September 5th for the Code Liberation Foundation.
The Code Liberation Foundation offers free/low cost development workshops in order to facilitate the creation of video game titles by women. Code Liberation events are trans-inclusive and women-only. Women of all skill levels and walks of life are invited to attend.
The Code Liberation Foundation offers free/low cost development workshops in order to facilitate the creation of video game titles by women. Code Liberation events are trans-inclusive and women-only. Women of all skill levels and walks of life are invited to attend.
If you are interested in VR, identify as a woman, and are in the NY area, I'd love to see you there. Space is limited, so sign up today!
Thứ Ba, 18 tháng 8, 2015
Oculus Rift in Action is now available as an e-book!
Oculus Rift in Action is now available as an e-book. Print book will be available 8/20.
Thứ Tư, 29 tháng 7, 2015
Working with the Rift is changing how I dream
The first video game influenced dream I remember having was back in the late eighties. I was obsessed with Tetris and had very vivid dreams of Tetris blocks falling on me. So, it isn’t surprising to me that playing video games can change the way you dream. That said, the specific effect that working with the Rift has had on my dreams did surprise me.
When using the Rift, you are sitting in place and the the world moves around or past you instead of like real-life where you move though the world. I find now in my dreams, no matter what I am dreaming about, there are now two kinds of movement - movement where I dream I am moving through a world and movement where I am still and the world moves around or past me. Perhaps, this kind of dreaming is an attempt by my brain to make Rift movement feel more natural to me? Anyone else dreaming like this?
When using the Rift, you are sitting in place and the the world moves around or past you instead of like real-life where you move though the world. I find now in my dreams, no matter what I am dreaming about, there are now two kinds of movement - movement where I dream I am moving through a world and movement where I am still and the world moves around or past me. Perhaps, this kind of dreaming is an attempt by my brain to make Rift movement feel more natural to me? Anyone else dreaming like this?
Thứ Ba, 23 tháng 6, 2015
Unity + Leap: Explicit instruction and hand gestures
I have been experimenting a bit with the LEAP and looking at getting objects into the user’s hand. In one of my experiments*, the user holds their hand out flat and a fairy appears. This experiment used explicit instruction written on menus to tell the user what to do.
Explicit instruction worked in that my test users did what I wanted them to - nod and hold their hand out flat. The downside, of course, is that it required them to read instructions which isn’t very immersive or fun. In future experiments, I want to look at implicit instruction, such as having non-player characters perform actions first.
* This demo is now available from the Leap Motion Gallery.
You can find all of the hand models in a scene using:
HandModel[] userHands = handcontroller.GetAllPhysicsHands();
To know if the hand is palm up, you can get the normal vector projecting from the hand relative to the controller, using:
userHands[0].GetPalmNormal()
To know if the hand is open or closed, you can look at the hand’s grab strength. The strength is zero for an open hand, and blends to 1.0 when a grabbing hand pose is recognized.
userHands[0].GetLeapHand().GrabStrength
To know where to place the object, you can get the palm position (relative to the controller), using:
userHands[0].GetPalmPosition()
Explicit instruction worked in that my test users did what I wanted them to - nod and hold their hand out flat. The downside, of course, is that it required them to read instructions which isn’t very immersive or fun. In future experiments, I want to look at implicit instruction, such as having non-player characters perform actions first.
* This demo is now available from the Leap Motion Gallery.
Notes on getting an object to appear on a user’s hand
Some quick notes on getting the fairy to appear on the user’s hand:You can find all of the hand models in a scene using:
HandModel[] userHands = handcontroller.GetAllPhysicsHands();
To know if the hand is palm up, you can get the normal vector projecting from the hand relative to the controller, using:
userHands[0].GetPalmNormal()
To know if the hand is open or closed, you can look at the hand’s grab strength. The strength is zero for an open hand, and blends to 1.0 when a grabbing hand pose is recognized.
userHands[0].GetLeapHand().GrabStrength
To know where to place the object, you can get the palm position (relative to the controller), using:
userHands[0].GetPalmPosition()
Thứ Tư, 3 tháng 6, 2015
Unity + Leap: Raising Your Hand to Get a Character's Attention
A common interaction in real life is to raise your hand to get someone’s attention. We do it when we are meeting someone in a crowd to help them find us, we do it when we are at school to get the teacher’s attention, and we do it as parents to get our child’s attention so they know that we are there and watching. We also do it when we want to hail a cab or make a bid at an auction. It is a simple enough interaction that babies do it almost instinctively. As simple as raising your hand is, using it as a mechanic in a VR environment brings up some interesting questions. How high should the user raise their hand to trigger the interaction? How long does the user need to have their hand raised? And, what should happen if the application loses hand tracking?
To experiment with this interaction, I created a demo consisting of a single character idling, minding his own business. When the user raises their hand, the character waves back and a speech bubble appears saying “Hello, there!”
Let’s take a look at the demo setup and then look at how testing the user experience went.
Setup
To create the scene I used basic 3D objects (planes, cubes) and a directional light to create a simple room. The character in the scene is a a rigged human character ("Carl") from the Male Character Pack by Mixamo. The speech bubble is created using a world space canvas (see: Thought Bubbles in a Rift scene). To get my hands in the scene, I used the LeapOVRPlayerController from the Leap Unity Core Assest v.2.2.4 (see: Seeing your hands in VR).
For the character animation, I used the Idle and Wave animations from the Raw Mocap data package for Macanim by Unity Technologies (free animations created from motion capture data) and I created an animation controller for the character to control when he is idling and when he waves back at you. The animation controller has two animation states, Idle and Wave. It also has two triggers that can be used to trigger the transition between each state:
And, of course, I wrote a script (wavinghello.cs) to detect when the user has raised their hand. The interesting bit of this script is how you know where the user’s hands are and how you know when a hand has been raised high enough so that you can trigger the appropriate animation. Let's take a look at the script's Update() function:
To get the all of the hands in the scene, the script uses GetAllPhysicsHands()
from HandController.cs:
GetAllPhysicsHands() returns an array of all Leap physics HandModels for the specified HandController. To get each hand's position, the script uses GetPalmPosition() which returns the Vector3 position of the HandModel relative to the HandController. The HandController is located at 0, 0, 0 relative to its parent object, the CenterEyeAnchor.
The CenterEyeAnchor object is used by the Oculus Rift integration scripts to maintain a position directly between the two eye cameras. As the cameras are the user’s eyes, if the Y value of a HandModel object's position is greater than the Y value of the centerEyeAnchor, we know the user's hand has been raised above eye level.
The user experience
When testing this demo I was looking at how high the user should raise their hand to trigger the interaction, how long the user should have their hand raised, and, what the application should do when it loses hand tracking. Initially, I went with what seemed comfortable for me. I required the users to raise their hand (measured from the center of their palm) to above eye level and I did not require the user's hand to be raised for any specific amount of time. If the Leap lost hand tracking, the application treated it as though all hands were below eye level.I then grabbed three people to do some testing. The only instruction I gave them was to “raise your hand to get the guy’s attention.” For my first user, the demo worked quite well. He raised his hand and the character waved back as expected. Great so far. My second user was resistant to raising his hand any higher than his nose. He quickly got frustrated as he could not get the guy’s attention. My third user raised his hand and then waved it wildly around so much so that the speech bubble flickered and was unreadable. Quite a range of results for only three users.
For my next iteration, I set the threshold for raising one’s hand a few centimeters below eye level.
models.GetPalmPosition().y >= centerEyeAnchor.transform.position.y - 0.03f
This worked for my second user as it was low enough that he would trigger the interaction, but not so low that he would accidentally trigger it.
I haven’t done anything to address the third user yet, but whatever I do, waving my hands like a maniac is now part of my my own testing checklist.
I’d love to hear if anyone else is using this type of mechanic and what their experiences are.
Nhãn:
DK2,
GUI,
leap motion,
oculus,
oculus rift,
rift,
UI,
unity,
usability,
virtual reality,
VR
Thứ Sáu, 15 tháng 5, 2015
Oculus SDK 0.6.0 and Oculus Rift in Action
Oculus publicly released version 0.6 their SDK today. This version represents the biggest change to the API since the first release of the C API in version 0.3, slightly over a year ago. The new version simplifies the API in a number of ways:
So those who have purchased or intend to purchase our book may be asking themselves what version we'll be covering exactly.
The short answer is that currently the book covers version 0.5 of the SDK (which itself is almost identical to version 0.4.4). That isn't likely to change before print. At this point we're well into the final stages of publication, doing final editorial passes for proofreading. If we were to update to 0.6 we would have to go back and revise quite a few chapters and start much of that work over again. That said, when we found out what a big change 0.6 was, there was much discussion, consideration and consternation.
However, with the public release of the SDK, there came a more compelling reason for us to stay with the version we're currently targeting. In a recent blog post on the Oculus website, Atman Binstock stated...
We believe that VR will also grow beyond the confines of gaming, probably in ways we can't even imagine right now. However, to do that, we need to make sure as many people as possible have the opportunity to try new ideas. And while Macs and Linux machines may hold an almost insignificant market share when it comes to gaming, we believe that new ideas can be found anywhere and that innovators probably aren't divided proportionately in the same way that operating systems are.
So we were faced with a choice. We could stick with the 0.5 SDK, which still functions with the new Oculus runtime (at least for the DK1 and DK2). We could abandon Linux and Mac developers and switch to the 0.6 SDK. Or we could try to cover both 0.6 and 0.5 in the book. We chose the first option.
Now, if you're a Windows developer and you want to move to 0.6, we still want to support you. To that end, we will have a branch of our Github examples that will keep up to date with the latest version of the SDK.
Additionally, we will try to cover the gaps between what the book teaches, and and the current version of the SDK with articles on this blog. I'm not talking about errata, but something more like whole updated chapter sections.
We will also be working to create examples focused on other mechanisms of working with VR devices, such as the Razer OSVR and the HTC Vive, using the appropriate SDKs.
We also feel that there is a great deal of value in the book as it stands now that is outside of the low level SDK details. In fact, to be honest, the bulk of the changes to the book would probably be in chapters 4 and 5, and there are a dozen chapters.
The point is, whatever platform you're on, whatever hardware you're working with, if you want to create a world, we want to help. The forthcoming edition of Oculus Rift in Action is only the first step.
- Removed the distinction between direct and extended modes from the perspective of the developer
- Removes support for client-side distortion
- Moves the management of the textures used for offscreen rendering from the client application to the SDK
- Fixes a number of OpenGL limitations
- etc, etc...
So those who have purchased or intend to purchase our book may be asking themselves what version we'll be covering exactly.
The short answer is that currently the book covers version 0.5 of the SDK (which itself is almost identical to version 0.4.4). That isn't likely to change before print. At this point we're well into the final stages of publication, doing final editorial passes for proofreading. If we were to update to 0.6 we would have to go back and revise quite a few chapters and start much of that work over again. That said, when we found out what a big change 0.6 was, there was much discussion, consideration and consternation.
However, with the public release of the SDK, there came a more compelling reason for us to stay with the version we're currently targeting. In a recent blog post on the Oculus website, Atman Binstock stated...
Our development for OS X and Linux has been paused in order to focus on delivering a high quality consumer-level VR experience at launch across hardware, software, and content on Windows. We want to get back to development for OS X and Linux but we don’t have a timeline.Since we started writing the book, we've felt very strongly about keeping a cross-platform focus. While it's likely that most of the initial consumer demand for the Rift will be driven by gamers, we the authors feel that VR has a promising future beyond just the realms of gaming. Two of the core components that make the Rift possible are powerful consumer graphics processors and cheap, accurate inertial measurement units (IMUs). Much of the initial consumer demand for both of these technologies was driven by gaming, but in both cases the use of the technologies is spreading far beyond that.
We believe that VR will also grow beyond the confines of gaming, probably in ways we can't even imagine right now. However, to do that, we need to make sure as many people as possible have the opportunity to try new ideas. And while Macs and Linux machines may hold an almost insignificant market share when it comes to gaming, we believe that new ideas can be found anywhere and that innovators probably aren't divided proportionately in the same way that operating systems are.
So we were faced with a choice. We could stick with the 0.5 SDK, which still functions with the new Oculus runtime (at least for the DK1 and DK2). We could abandon Linux and Mac developers and switch to the 0.6 SDK. Or we could try to cover both 0.6 and 0.5 in the book. We chose the first option.
Now, if you're a Windows developer and you want to move to 0.6, we still want to support you. To that end, we will have a branch of our Github examples that will keep up to date with the latest version of the SDK.
Additionally, we will try to cover the gaps between what the book teaches, and and the current version of the SDK with articles on this blog. I'm not talking about errata, but something more like whole updated chapter sections.
We will also be working to create examples focused on other mechanisms of working with VR devices, such as the Razer OSVR and the HTC Vive, using the appropriate SDKs.
We also feel that there is a great deal of value in the book as it stands now that is outside of the low level SDK details. In fact, to be honest, the bulk of the changes to the book would probably be in chapters 4 and 5, and there are a dozen chapters.
The point is, whatever platform you're on, whatever hardware you're working with, if you want to create a world, we want to help. The forthcoming edition of Oculus Rift in Action is only the first step.
Thứ Hai, 11 tháng 5, 2015
Book Update!
We are heading into the final stretch with our book Oculus Rift in Action. All chapters are now complete and we are just about half-way through the final editing process. The book is available for pre-order from Amazon. If you can't wait to get your hands on it, you can order directly from Manning Publications and get access to all chapters now through the Manning Early Access Program.
Thứ Năm, 2 tháng 4, 2015
Unity + Leap: Hand Selection UI Prototype
Immersion is definitely affected by how closely your avatar's hand looks like your own. In the demo I am working on I want the user to be able to select the hands they have in the game before entering the game. A prototype in-game UI for hand selection is seen in the video below.
To create this UI, I created a world space canvas and added buttons for each of the available hands. To each button, I added a box collider as a child object. A script attached to the box collider detects when a hand has collided with it. To detect a hand, I used the Leap libraries and then checked to see if the collision object is a Leap HandModel.
In this prototype UI, I am using large buttons for two reasons. First, reading small text in the Rift can be difficult, and second, while using the Leap allows me to see my hands, in my experience, it does not track finger motion well enough for detailed interactions to be effective. In several of the tests I ran, the user's hand was generally in the right place but the fingers more often than not were at different angles than the user's actual hand. The effect was that my users seemed to have the fine motor skills of a toddler - they could reach out and touch everything but they didn't have a lot of control. On the positive side, when the user has hands in the game, it appears to be very natural for users to try to touch items with their hands. Even when users don't have visible hands in the scene, you'll often see them reaching out to try to touch things. While I have the start button say "Touch to Start," once users know to use their hand to affect the scene they get it right away and don't need prompting or other instruction.
Leap Motion has just released a "Best Practices Guide" and I'll be looking at incorporating many of the ideas documented there in future prototypes.
Đăng ký:
Bài đăng (Atom)