mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-09 17:38:34 +02:00
Rather than adding Euler angles, compose quaternions for gyros.
This commit is contained in:
parent
5967fbcae8
commit
e2ec8245b0
5 changed files with 15 additions and 7 deletions
|
@ -1274,7 +1274,7 @@ void Application::init() {
|
||||||
|
|
||||||
void Application::updateAvatar(float deltaTime) {
|
void Application::updateAvatar(float deltaTime) {
|
||||||
// Update my avatar's head position from gyros
|
// Update my avatar's head position from gyros
|
||||||
_myAvatar.updateHeadFromGyros(deltaTime, &_serialPort, &_gravity);
|
_myAvatar.updateHeadFromGyros(deltaTime, &_serialPort);
|
||||||
|
|
||||||
// Grab latest readings from the gyros
|
// Grab latest readings from the gyros
|
||||||
float measuredPitchRate = _serialPort.getLastPitchRate();
|
float measuredPitchRate = _serialPort.getLastPitchRate();
|
||||||
|
|
|
@ -124,7 +124,7 @@ void Avatar::reset() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update avatar head rotation with sensor data
|
// Update avatar head rotation with sensor data
|
||||||
void Avatar::updateHeadFromGyros(float deltaTime, SerialInterface* serialInterface, glm::vec3* gravity) {
|
void Avatar::updateHeadFromGyros(float deltaTime, SerialInterface* serialInterface) {
|
||||||
const float AMPLIFY_PITCH = 2.f;
|
const float AMPLIFY_PITCH = 2.f;
|
||||||
const float AMPLIFY_YAW = 2.f;
|
const float AMPLIFY_YAW = 2.f;
|
||||||
const float AMPLIFY_ROLL = 2.f;
|
const float AMPLIFY_ROLL = 2.f;
|
||||||
|
@ -134,10 +134,10 @@ void Avatar::updateHeadFromGyros(float deltaTime, SerialInterface* serialInterfa
|
||||||
float measuredRollRate = serialInterface->getLastRollRate();
|
float measuredRollRate = serialInterface->getLastRollRate();
|
||||||
|
|
||||||
// Update avatar head position based on measured gyro rates
|
// Update avatar head position based on measured gyro rates
|
||||||
|
_head.setOrientation(_head.getOrientation() * glm::quat(glm::radians(glm::vec3(
|
||||||
_head.addPitch(measuredPitchRate * AMPLIFY_PITCH * deltaTime);
|
measuredPitchRate * AMPLIFY_PITCH * deltaTime,
|
||||||
_head.addYaw (measuredYawRate * AMPLIFY_YAW * deltaTime);
|
measuredYawRate * AMPLIFY_YAW * deltaTime,
|
||||||
_head.addRoll (measuredRollRate * AMPLIFY_ROLL * deltaTime);
|
measuredRollRate * AMPLIFY_ROLL * deltaTime))));
|
||||||
|
|
||||||
// Update head lean distance based on accelerometer data
|
// Update head lean distance based on accelerometer data
|
||||||
glm::vec3 headRotationRates(_head.getPitch(), _head.getYaw(), _head.getRoll());
|
glm::vec3 headRotationRates(_head.getPitch(), _head.getYaw(), _head.getRoll());
|
||||||
|
|
|
@ -48,7 +48,7 @@ public:
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
void simulate(float deltaTime, Transmitter* transmitter);
|
void simulate(float deltaTime, Transmitter* transmitter);
|
||||||
void updateHeadFromGyros(float frametime, SerialInterface * serialInterface, glm::vec3 * gravity);
|
void updateHeadFromGyros(float frametime, SerialInterface * serialInterface);
|
||||||
void updateFromMouse(int mouseX, int mouseY, int screenWidth, int screenHeight);
|
void updateFromMouse(int mouseX, int mouseY, int screenWidth, int screenHeight);
|
||||||
void addBodyYaw(float y) {_bodyYaw += y;};
|
void addBodyYaw(float y) {_bodyYaw += y;};
|
||||||
void render(bool lookingInMirror);
|
void render(bool lookingInMirror);
|
||||||
|
|
|
@ -307,6 +307,13 @@ void Head::renderMohawk(glm::vec3 cameraPosition) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Head::setOrientation(const glm::quat& orientation) {
|
||||||
|
glm::vec3 eulerAngles = safeEulerAngles(glm::inverse(glm::quat(glm::radians(_bodyRotation))) * orientation);
|
||||||
|
_pitch = eulerAngles.x;
|
||||||
|
_yaw = eulerAngles.y;
|
||||||
|
_roll = eulerAngles.z;
|
||||||
|
}
|
||||||
|
|
||||||
glm::quat Head::getOrientation() const {
|
glm::quat Head::getOrientation() const {
|
||||||
return glm::quat(glm::radians(_bodyRotation)) * glm::quat(glm::radians(_lookingInMirror ?
|
return glm::quat(glm::radians(_bodyRotation)) * glm::quat(glm::radians(_lookingInMirror ?
|
||||||
glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll)));
|
glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll)));
|
||||||
|
|
|
@ -45,6 +45,7 @@ public:
|
||||||
void setAverageLoudness(float averageLoudness ) { _averageLoudness = averageLoudness; }
|
void setAverageLoudness(float averageLoudness ) { _averageLoudness = averageLoudness; }
|
||||||
void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; }
|
void setReturnToCenter (bool returnHeadToCenter) { _returnHeadToCenter = returnHeadToCenter; }
|
||||||
void setRenderLookatVectors(bool onOff ) { _renderLookatVectors = onOff; }
|
void setRenderLookatVectors(bool onOff ) { _renderLookatVectors = onOff; }
|
||||||
|
void setOrientation(const glm::quat& orientation);
|
||||||
|
|
||||||
glm::quat getOrientation() const;
|
glm::quat getOrientation() const;
|
||||||
glm::quat getWorldAlignedOrientation () const;
|
glm::quat getWorldAlignedOrientation () const;
|
||||||
|
|
Loading…
Reference in a new issue