Download

Why does my Oculus report itself as a Steam device instead?

HeadmountedDisplayTypes.h has this nice enum:
namespace EHMDDeviceType
{
enum Type
{
DT_OculusRift,
DT_Morpheus,
DT_ES2GenericStereoMesh,
DT_SteamVR,
DT_GearVR
};
}

which gets returned by: GEngine->HMDDevice->GetHMDDeviceType().
Last fall, I was able to tell the difference between the Vive and the Rift by doing == DT_SteamVR. But now, my Rift is being treated as a SteamVR device, and I can’t tell the difference between it and a Vive. Even if I nuke all steam processes (steam, steam vr, compositor, etc) it the HMD is still being created as a SteamVR object. This is incredibly annoying. Why did Valve coopt another company’s product?

I’ve got both the Oculus plugin and the Steam plugin enabled on 4.11, and I want to support both. But since one is seated and one is standing, I’d like to treat them differently and do the right thing for camera position and the like. That’s a lot harder if I can’t tell what I’ve got. Is there some other way to do this that I’m missing?

Thanks,

Rick

From what I can tell in 4.11, a lot has changed for the camera. Read the patch notes.

There is a “Set Tracking Origin” function which lets you set either “Floor Level” or “Eye Level”. But through my own testing, I found that this value is not actually used and it is always set to eye level, and all positions are relative to the initial eye position in room space.

I recommend not writing code specifically for rift vs vive. Rift can support a room scale game play experience, and once the touch controllers come out, they’ll support motion controllers as well. Instead, you should assume that both devices can be either a seated experience or a standing experience, and you can design your game to support one or the other, or both.

If you absolutely must be able to differentiate from the vive vs. rift, I think there’s a way to read the temperature of the HMD. The vive always returns a value of 0 and the rift always returns a non-zero value. My guess is that the device type enum is unused. Hell, they still have DT_Morpheus, which has since been rebranded to PSVR.

Is there a clear explanation somewhere of what the right way is to handle seated/standing camera position? As best I can tell, the Vive does things measured from the floor, and the oculus does them from the center of the player capsule. So if you treat them both the same you are wrong on one or the other.