fixed interactive navigation in left-handed coordinate systems

metadata
Wenzel Jakob 2010-08-18 18:02:11 +02:00
parent 9fed7118bf
commit a1fbdddc50
2 changed files with 16 additions and 13 deletions

View File

@ -558,9 +558,10 @@ void GLWidget::mouseMoveEvent(QMouseEvent *event) {
if (camera->getViewTransform().det3x3() < 0) { if (camera->getViewTransform().det3x3() < 0) {
camera->setInverseViewTransform(Transform::lookAt(p, p+direction, m_context->up)); camera->setInverseViewTransform(Transform::lookAt(p, p+direction, m_context->up));
} else { } else {
p.z = -p.z; direction.z = -direction.z; camera->setInverseViewTransform(
camera->setInverseViewTransform(Transform::scale(Vector(1,1,-1)) * Transform::lookAt(p, p+direction, m_context->up) *
Transform::lookAt(p, p+direction, m_context->up)); Transform::scale(Vector(-1,1,1))
);
} }
didMove = true; didMove = true;
} }
@ -568,14 +569,16 @@ void GLWidget::mouseMoveEvent(QMouseEvent *event) {
if (event->buttons() & Qt::RightButton) { if (event->buttons() & Qt::RightButton) {
Float roll = rel.x() * m_mouseSensitivity * .02f; Float roll = rel.x() * m_mouseSensitivity * .02f;
Float fovChange = rel.y() * m_mouseSensitivity * .03f; Float fovChange = rel.y() * m_mouseSensitivity * .03f;
m_context->up = Transform::rotate(direction, roll)(m_context->up);
if (camera->getViewTransform().det3x3() < 0) { if (camera->getViewTransform().det3x3() < 0) {
m_context->up = Transform::rotate(direction, roll)(m_context->up);
camera->setInverseViewTransform(Transform::lookAt(p, p+direction, m_context->up)); camera->setInverseViewTransform(Transform::lookAt(p, p+direction, m_context->up));
} else { } else {
p.z = -p.z; direction.z = -direction.z; m_context->up = Transform::rotate(direction, -roll)(m_context->up);
camera->setInverseViewTransform(Transform::scale(Vector(1,1,-1)) * camera->setInverseViewTransform(
Transform::lookAt(p, p+direction, m_context->up)); Transform::lookAt(p, p+direction, m_context->up) *
Transform::scale(Vector(-1,1,1))
);
} }
camera->setFov(std::min(std::max((Float) 1.0f, camera->getFov() + fovChange), (Float) 100.0f)); camera->setFov(std::min(std::max((Float) 1.0f, camera->getFov() + fovChange), (Float) 100.0f));
@ -587,8 +590,7 @@ void GLWidget::mouseMoveEvent(QMouseEvent *event) {
if (event->buttons() & Qt::MidButton) { if (event->buttons() & Qt::MidButton) {
camera->setViewTransform( camera->setViewTransform(
Transform::translate(Vector(-(Float) rel.x(), (Float) rel.y(), 0) Transform::translate(Vector(-(Float) rel.x(), (Float) rel.y(), 0)
* m_mouseSensitivity * .6f * m_mouseSensitivity * .6f * m_context->movementScale)
* m_context->movementScale)
* camera->getViewTransform()); * camera->getViewTransform());
didMove = true; didMove = true;
} }
@ -688,7 +690,8 @@ void GLWidget::paintGL() {
if (m_framebuffer == NULL || if (m_framebuffer == NULL ||
m_framebuffer->getBitmap()->getWidth() != m_context->framebuffer->getWidth() || m_framebuffer->getBitmap()->getWidth() != m_context->framebuffer->getWidth() ||
m_framebuffer->getBitmap()->getHeight() != m_context->framebuffer->getHeight() || m_framebuffer->getBitmap()->getHeight() != m_context->framebuffer->getHeight() ||
(m_softwareFallback && m_framebuffer->getBitmap() != m_fallbackBitmap)) { (m_softwareFallback && m_framebuffer->getBitmap() != m_fallbackBitmap) ||
(!m_softwareFallback && m_framebuffer->getBitmap() != m_context->framebuffer)) {
if (m_framebuffer) if (m_framebuffer)
m_framebuffer->cleanup(); m_framebuffer->cleanup();
if (!m_softwareFallback) { if (!m_softwareFallback) {
@ -722,6 +725,7 @@ void GLWidget::paintGL() {
sourceData++; sourceData++;
} }
} }
} else {
} }
m_framebuffer->refresh(); m_framebuffer->refresh();
m_framebufferChanged = false; m_framebufferChanged = false;

View File

@ -140,10 +140,9 @@ void saveScene(QWidget *parent, SceneContext *ctx, const QString &targetFile) {
Point t, p = sceneCamera->getInverseViewTransform()(Point(0,0,0)); Point t, p = sceneCamera->getInverseViewTransform()(Point(0,0,0));
if (sceneCamera->getViewTransform().det3x3() > 0) { if (sceneCamera->getViewTransform().det3x3() > 0) {
p.z = -p.z; direction.z = -direction.z;
QDomElement scale = doc.createElement("scale"); QDomElement scale = doc.createElement("scale");
cameraTransform.insertAfter(scale, lookAt); scale.setAttribute("x", "-1");
scale.setAttribute("z", "-1"); cameraTransform.insertBefore(scale, lookAt);
} }
t = p + direction; t = p + direction;