mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 16:14:35 +02:00
Merge pull request #502 from ey6es/gyroquat
Increase YAW_DECAY, remove roll from head camera, provide option for pitch/yaw scale (zero by default).
This commit is contained in:
commit
ece117e0b0
5 changed files with 20 additions and 8 deletions
|
@ -26,6 +26,7 @@
|
||||||
#include <QColorDialog>
|
#include <QColorDialog>
|
||||||
#include <QDialogButtonBox>
|
#include <QDialogButtonBox>
|
||||||
#include <QDesktopWidget>
|
#include <QDesktopWidget>
|
||||||
|
#include <QDoubleSpinBox>
|
||||||
#include <QFormLayout>
|
#include <QFormLayout>
|
||||||
#include <QGLWidget>
|
#include <QGLWidget>
|
||||||
#include <QKeyEvent>
|
#include <QKeyEvent>
|
||||||
|
@ -311,11 +312,11 @@ void Application::paintGL() {
|
||||||
} else if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
|
} else if (_myCamera.getMode() == CAMERA_MODE_FIRST_PERSON) {
|
||||||
_myCamera.setTightness(0.0f); // In first person, camera follows head exactly without delay
|
_myCamera.setTightness(0.0f); // In first person, camera follows head exactly without delay
|
||||||
_myCamera.setTargetPosition(_myAvatar.getBallPosition(AVATAR_JOINT_HEAD_BASE));
|
_myCamera.setTargetPosition(_myAvatar.getBallPosition(AVATAR_JOINT_HEAD_BASE));
|
||||||
_myCamera.setTargetRotation(_myAvatar.getHead().getWorldAlignedOrientation());
|
_myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation(_headCameraPitchYawScale));
|
||||||
|
|
||||||
} else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
|
} else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) {
|
||||||
_myCamera.setTargetPosition(_myAvatar.getHeadJointPosition());
|
_myCamera.setTargetPosition(_myAvatar.getHeadJointPosition());
|
||||||
_myCamera.setTargetRotation(_myAvatar.getHead().getWorldAlignedOrientation());
|
_myCamera.setTargetRotation(_myAvatar.getHead().getCameraOrientation(_headCameraPitchYawScale));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update camera position
|
// Update camera position
|
||||||
|
@ -1026,6 +1027,10 @@ void Application::editPreferences() {
|
||||||
avatarURL->setMinimumWidth(400);
|
avatarURL->setMinimumWidth(400);
|
||||||
form->addRow("Avatar URL:", avatarURL);
|
form->addRow("Avatar URL:", avatarURL);
|
||||||
|
|
||||||
|
QDoubleSpinBox* headCameraPitchYawScale = new QDoubleSpinBox();
|
||||||
|
headCameraPitchYawScale->setValue(_headCameraPitchYawScale);
|
||||||
|
form->addRow("Head Camera Pitch/Yaw Scale:", headCameraPitchYawScale);
|
||||||
|
|
||||||
QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
|
||||||
dialog.connect(buttons, SIGNAL(accepted()), SLOT(accept()));
|
dialog.connect(buttons, SIGNAL(accepted()), SLOT(accept()));
|
||||||
dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject()));
|
dialog.connect(buttons, SIGNAL(rejected()), SLOT(reject()));
|
||||||
|
@ -1038,6 +1043,8 @@ void Application::editPreferences() {
|
||||||
_settings->setValue("avatarURL", url);
|
_settings->setValue("avatarURL", url);
|
||||||
_myAvatar.getVoxels()->setVoxelURL(url);
|
_myAvatar.getVoxels()->setVoxelURL(url);
|
||||||
sendAvatarVoxelURLMessage(url);
|
sendAvatarVoxelURLMessage(url);
|
||||||
|
|
||||||
|
_headCameraPitchYawScale = headCameraPitchYawScale->value();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::pair() {
|
void Application::pair() {
|
||||||
|
@ -2537,15 +2544,19 @@ void Application::setAutosave(bool wantsAutosave) {
|
||||||
void Application::loadSettings(QSettings* set) {
|
void Application::loadSettings(QSettings* set) {
|
||||||
if (!set) set = getSettings();
|
if (!set) set = getSettings();
|
||||||
|
|
||||||
|
_headCameraPitchYawScale = set->value("headCameraPitchYawScale", 0.0f).toFloat();
|
||||||
scanMenuBar(&Application::loadAction, set);
|
scanMenuBar(&Application::loadAction, set);
|
||||||
getAvatar()->loadData(set);
|
getAvatar()->loadData(set);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::saveSettings(QSettings* set) {
|
void Application::saveSettings(QSettings* set) {
|
||||||
if (!set) set = getSettings();
|
if (!set) set = getSettings();
|
||||||
|
|
||||||
|
set->setValue("headCameraPitchYawScale", _headCameraPitchYawScale);
|
||||||
scanMenuBar(&Application::saveAction, set);
|
scanMenuBar(&Application::saveAction, set);
|
||||||
getAvatar()->saveData(set);
|
getAvatar()->saveData(set);
|
||||||
|
|
||||||
|
set->sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::importSettings() {
|
void Application::importSettings() {
|
||||||
|
|
|
@ -248,6 +248,7 @@ private:
|
||||||
|
|
||||||
int _headMouseX, _headMouseY;
|
int _headMouseX, _headMouseY;
|
||||||
bool _manualFirstPerson;
|
bool _manualFirstPerson;
|
||||||
|
float _headCameraPitchYawScale;
|
||||||
|
|
||||||
HandControl _handControl;
|
HandControl _handControl;
|
||||||
|
|
||||||
|
|
|
@ -314,10 +314,10 @@ glm::quat Head::getOrientation() const {
|
||||||
glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll)));
|
glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll)));
|
||||||
}
|
}
|
||||||
|
|
||||||
glm::quat Head::getWorldAlignedOrientation () const {
|
glm::quat Head::getCameraOrientation (float pitchYawScale) const {
|
||||||
Avatar* owningAvatar = static_cast<Avatar*>(_owningAvatar);
|
Avatar* owningAvatar = static_cast<Avatar*>(_owningAvatar);
|
||||||
return owningAvatar->getWorldAlignedOrientation() * glm::quat(glm::radians(_lookingInMirror ?
|
return owningAvatar->getWorldAlignedOrientation() * glm::quat(glm::radians(glm::vec3(
|
||||||
glm::vec3(_pitch, -_yaw, -_roll) : glm::vec3(_pitch, _yaw, _roll)));
|
_pitch * pitchYawScale, _yaw * pitchYawScale, 0.0f)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Head::renderHeadSphere() {
|
void Head::renderHeadSphere() {
|
||||||
|
|
|
@ -47,7 +47,7 @@ public:
|
||||||
void setRenderLookatVectors(bool onOff ) { _renderLookatVectors = onOff; }
|
void setRenderLookatVectors(bool onOff ) { _renderLookatVectors = onOff; }
|
||||||
|
|
||||||
glm::quat getOrientation() const;
|
glm::quat getOrientation() const;
|
||||||
glm::quat getWorldAlignedOrientation () const;
|
glm::quat getCameraOrientation (float pitchYawScale) const;
|
||||||
|
|
||||||
glm::vec3 getRightDirection() const { return getOrientation() * IDENTITY_RIGHT; }
|
glm::vec3 getRightDirection() const { return getOrientation() * IDENTITY_RIGHT; }
|
||||||
glm::vec3 getUpDirection () const { return getOrientation() * IDENTITY_UP; }
|
glm::vec3 getUpDirection () const { return getOrientation() * IDENTITY_UP; }
|
||||||
|
|
|
@ -264,7 +264,7 @@ void SerialInterface::readData(float deltaTime) {
|
||||||
1.0f / SENSOR_FUSION_SAMPLES);
|
1.0f / SENSOR_FUSION_SAMPLES);
|
||||||
|
|
||||||
// Without a compass heading, always decay estimated Yaw slightly
|
// Without a compass heading, always decay estimated Yaw slightly
|
||||||
const float YAW_DECAY = 0.995;
|
const float YAW_DECAY = 0.999f;
|
||||||
glm::vec3 forward = estimatedRotation * glm::vec3(0.0f, 0.0f, -1.0f);
|
glm::vec3 forward = estimatedRotation * glm::vec3(0.0f, 0.0f, -1.0f);
|
||||||
estimatedRotation = safeMix(glm::angleAxis(glm::degrees(atan2f(forward.x, -forward.z)),
|
estimatedRotation = safeMix(glm::angleAxis(glm::degrees(atan2f(forward.x, -forward.z)),
|
||||||
glm::vec3(0.0f, 1.0f, 0.0f)) * estimatedRotation, estimatedRotation, YAW_DECAY);
|
glm::vec3(0.0f, 1.0f, 0.0f)) * estimatedRotation, estimatedRotation, YAW_DECAY);
|
||||||
|
|
Loading…
Reference in a new issue