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);