From 844173d5714b09b9ff63a08bc2dc280e7906f59f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D0=B5=D0=BB=D0=B8=D0=BF=D0=B5=D0=BD=D0=BA=D0=BE=20?= =?UTF-8?q?=D0=98=D0=B2=D0=B0=D0=BD?= Date: Tue, 3 Dec 2019 08:45:05 +0000 Subject: [PATCH] git-svn-id: svn://db.shs.com.ru/libs@640 a8b55f48-bf90-11e4-a774-851b48703e85 --- qglengine/core/gltransform.cpp | 7 ++++++- qglengine/core/gltransform.h | 2 +- qglengine/globject.cpp | 2 +- qglengine/mouse_controller.cpp | 10 +++------- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/qglengine/core/gltransform.cpp b/qglengine/core/gltransform.cpp index d725900..adfe327 100644 --- a/qglengine/core/gltransform.cpp +++ b/qglengine/core/gltransform.cpp @@ -377,7 +377,7 @@ QQuaternion Transform::fromAxes(const QVector3D & xAxis, const QVector3D & yAxis } -QVector3D Transform::fromDirection(QVector3D d) { +QVector3D Transform::fromDirection(QVector3D d, float roll) { QVector3D ret; //QMatrix3x3 m = QQuaternion::fromDirection(d, QVector3D()).toRotationMatrix(); //ret[0] = -atan2(m(0, 2), m(1, 2)); @@ -385,7 +385,12 @@ QVector3D Transform::fromDirection(QVector3D d) { //ret[2] = atan2(m(2, 0), m(2, 1)); d.normalize(); ret[0] = M_PI - acos(d.z()); + ret[1] = roll * deg2rad; ret[2] = -atan2(d.x(), d.y()); + if (ret[0] < 0.) ret[0] += M_2PI; + if (ret[0] >= M_2PI) ret[0] -= M_2PI; + if (ret[2] < 0.) ret[2] += M_2PI; + if (ret[2] >= M_2PI) ret[2] -= M_2PI; return ret * rad2deg; } diff --git a/qglengine/core/gltransform.h b/qglengine/core/gltransform.h index 6dbadbf..096d48c 100644 --- a/qglengine/core/gltransform.h +++ b/qglengine/core/gltransform.h @@ -73,7 +73,7 @@ public: const QVector3D & axis3, float angle3); static QQuaternion fromAxes(const QVector3D & xAxis, const QVector3D & yAxis, const QVector3D & zAxis); - static QVector3D fromDirection(QVector3D d); + static QVector3D fromDirection(QVector3D d, float roll = 0.f); static QVector3D fromRotationMatrix(const QMatrix3x3 & m); static QMatrix3x3 toRotationMatrix(const QVector3D & r); diff --git a/qglengine/globject.cpp b/qglengine/globject.cpp index 4f00cf2..d3fb39f 100644 --- a/qglengine/globject.cpp +++ b/qglengine/globject.cpp @@ -453,7 +453,7 @@ QVector3D AimedObject::worldAim() const { void AimedObject::setAim(const QVector3D & p) { QVector3D dir = p - pos(); - trans.setRotation(Transform::fromDirection(dir)); + trans.setRotation(Transform::fromDirection(dir, trans.rotationY())); aim_dist = dir.length(); buildTransform(); //qDebug() << "setAim" << p << aim(); diff --git a/qglengine/mouse_controller.cpp b/qglengine/mouse_controller.cpp index 3ae62c9..4d8c6fa 100644 --- a/qglengine/mouse_controller.cpp +++ b/qglengine/mouse_controller.cpp @@ -137,13 +137,9 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) { QMatrix4x4 pmat; foreach (ObjectBase * o, objects) { pmat.setToIdentity(); - if (o->selected_aim) { - pmat = o->itransform_.inverted(); - } else { - if (o->parent()) - pmat = o->parent()->worldTransform().inverted(); - } - QVector3D dv = (pmat * QVector4D(axe_vector, 0)).toVector3D(); + if (o->parent()) + pmat = o->parent()->worldTransform().inverted(); + QVector3D dv = pmat.mapVector(axe_vector); if (o->selected_aim) { AimedObject * ao = (AimedObject*)o; ao->setAim(ao->aim() + dv);