Fixes for oculus rift support

* should work in standing and 'seated' mode
* OculusBaseDisplayPlugin getModelView now only applies eye offset to match behavior from the OpenVRPlugin
This commit is contained in:
Anthony J. Thibault 2015-07-16 16:00:39 -07:00
parent 1083534d83
commit ef0a157111
3 changed files with 18 additions and 6 deletions

View file

@ -250,6 +250,14 @@ void MyAvatar::simulate(float deltaTime) {
maybeUpdateBillboard(); maybeUpdateBillboard();
} }
glm::mat4 MyAvatar::getSensorToWorldMatrix() const {
if (getStandingHMDSensorMode()) {
return _sensorToWorldMatrix;
} else {
return createMatFromQuatAndPos(getWorldAlignedOrientation(), getDefaultEyePosition());
}
}
// best called at end of main loop, just before rendering. // best called at end of main loop, just before rendering.
// update sensor to world matrix from current body position and hmd sensor. // update sensor to world matrix from current body position and hmd sensor.
// This is so the correct camera can be used for rendering. // This is so the correct camera can be used for rendering.
@ -261,10 +269,12 @@ void MyAvatar::updateFromHMDSensorMatrix(const glm::mat4& hmdSensorMatrix) {
_hmdSensorOrientation = glm::quat_cast(hmdSensorMatrix); _hmdSensorOrientation = glm::quat_cast(hmdSensorMatrix);
_bodySensorMatrix = deriveBodyFromHMDSensor(); _bodySensorMatrix = deriveBodyFromHMDSensor();
// set the body position/orientation to reflect motion due to the head. if (getStandingHMDSensorMode()) {
auto worldMat = _sensorToWorldMatrix * _bodySensorMatrix; // set the body position/orientation to reflect motion due to the head.
setPosition(extractTranslation(worldMat)); auto worldMat = _sensorToWorldMatrix * _bodySensorMatrix;
setOrientation(glm::quat_cast(worldMat)); setPosition(extractTranslation(worldMat));
setOrientation(glm::quat_cast(worldMat));
}
} }
// best called at end of main loop, just before rendering. // best called at end of main loop, just before rendering.

View file

@ -48,7 +48,7 @@ public:
const glm::mat4& getHMDSensorMatrix() const { return _hmdSensorMatrix; } const glm::mat4& getHMDSensorMatrix() const { return _hmdSensorMatrix; }
const glm::vec3& getHMDSensorPosition() const { return _hmdSensorPosition; } const glm::vec3& getHMDSensorPosition() const { return _hmdSensorPosition; }
const glm::quat& getHMDSensorOrientation() const { return _hmdSensorOrientation; } const glm::quat& getHMDSensorOrientation() const { return _hmdSensorOrientation; }
glm::mat4 getSensorToWorldMatrix() const { return _sensorToWorldMatrix; } glm::mat4 getSensorToWorldMatrix() const;
// best called at start of main loop just after we have a fresh hmd pose. // best called at start of main loop just after we have a fresh hmd pose.
// update internal body position from new hmd pose. // update internal body position from new hmd pose.

View file

@ -54,7 +54,9 @@ glm::mat4 OculusBaseDisplayPlugin::getProjection(Eye eye, const glm::mat4& baseP
} }
glm::mat4 OculusBaseDisplayPlugin::getModelview(Eye eye, const glm::mat4& baseModelview) const { glm::mat4 OculusBaseDisplayPlugin::getModelview(Eye eye, const glm::mat4& baseModelview) const {
return baseModelview * toGlm(_eyePoses[eye]); auto eyeOffsetMat = glm::mat4();
setTranslation(eyeOffsetMat, toGlm(_eyeOffsets[eye]));
return baseModelview * eyeOffsetMat;
} }
void OculusBaseDisplayPlugin::resetSensors() { void OculusBaseDisplayPlugin::resetSensors() {