git-svn-id: svn://db.shs.com.ru/libs@640 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -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;
|
QVector3D ret;
|
||||||
//QMatrix3x3 m = QQuaternion::fromDirection(d, QVector3D()).toRotationMatrix();
|
//QMatrix3x3 m = QQuaternion::fromDirection(d, QVector3D()).toRotationMatrix();
|
||||||
//ret[0] = -atan2(m(0, 2), m(1, 2));
|
//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));
|
//ret[2] = atan2(m(2, 0), m(2, 1));
|
||||||
d.normalize();
|
d.normalize();
|
||||||
ret[0] = M_PI - acos(d.z());
|
ret[0] = M_PI - acos(d.z());
|
||||||
|
ret[1] = roll * deg2rad;
|
||||||
ret[2] = -atan2(d.x(), d.y());
|
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;
|
return ret * rad2deg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public:
|
|||||||
const QVector3D & axis3, float angle3);
|
const QVector3D & axis3, float angle3);
|
||||||
static QQuaternion fromAxes(const QVector3D & xAxis, const QVector3D & yAxis, const QVector3D & zAxis);
|
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 QVector3D fromRotationMatrix(const QMatrix3x3 & m);
|
||||||
static QMatrix3x3 toRotationMatrix(const QVector3D & r);
|
static QMatrix3x3 toRotationMatrix(const QVector3D & r);
|
||||||
|
|
||||||
|
|||||||
@@ -453,7 +453,7 @@ QVector3D AimedObject::worldAim() const {
|
|||||||
|
|
||||||
void AimedObject::setAim(const QVector3D & p) {
|
void AimedObject::setAim(const QVector3D & p) {
|
||||||
QVector3D dir = p - pos();
|
QVector3D dir = p - pos();
|
||||||
trans.setRotation(Transform::fromDirection(dir));
|
trans.setRotation(Transform::fromDirection(dir, trans.rotationY()));
|
||||||
aim_dist = dir.length();
|
aim_dist = dir.length();
|
||||||
buildTransform();
|
buildTransform();
|
||||||
//qDebug() << "setAim" << p << aim();
|
//qDebug() << "setAim" << p << aim();
|
||||||
|
|||||||
@@ -137,13 +137,9 @@ void MouseController::mouseMoveEvent(QMouseEvent * e) {
|
|||||||
QMatrix4x4 pmat;
|
QMatrix4x4 pmat;
|
||||||
foreach (ObjectBase * o, objects) {
|
foreach (ObjectBase * o, objects) {
|
||||||
pmat.setToIdentity();
|
pmat.setToIdentity();
|
||||||
if (o->selected_aim) {
|
if (o->parent())
|
||||||
pmat = o->itransform_.inverted();
|
pmat = o->parent()->worldTransform().inverted();
|
||||||
} else {
|
QVector3D dv = pmat.mapVector(axe_vector);
|
||||||
if (o->parent())
|
|
||||||
pmat = o->parent()->worldTransform().inverted();
|
|
||||||
}
|
|
||||||
QVector3D dv = (pmat * QVector4D(axe_vector, 0)).toVector3D();
|
|
||||||
if (o->selected_aim) {
|
if (o->selected_aim) {
|
||||||
AimedObject * ao = (AimedObject*)o;
|
AimedObject * ao = (AimedObject*)o;
|
||||||
ao->setAim(ao->aim() + dv);
|
ao->setAim(ao->aim() + dv);
|
||||||
|
|||||||
Reference in New Issue
Block a user