git-svn-id: svn://db.shs.com.ru/libs@641 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-12-03 10:55:21 +00:00
parent 844173d571
commit c38678056d
7 changed files with 14 additions and 12 deletions

View File

@@ -377,7 +377,7 @@ QQuaternion Transform::fromAxes(const QVector3D & xAxis, const QVector3D & yAxis
} }
QVector3D Transform::fromDirection(QVector3D d, float roll) { QVector3D Transform::fromDirection(QVector3D d, float pitch) {
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,10 +385,10 @@ QVector3D Transform::fromDirection(QVector3D d, float roll) {
//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[1] = pitch * 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] < 0.) ret[0] += M_2PI;
if (ret[0] >= M_2PI) ret[0] -= M_2PI; //if (ret[0] >= M_2PI) ret[0] -= M_2PI;
if (ret[2] < 0.) ret[2] += M_2PI; if (ret[2] < 0.) ret[2] += M_2PI;
if (ret[2] >= M_2PI) ret[2] -= M_2PI; if (ret[2] >= M_2PI) ret[2] -= M_2PI;
return ret * rad2deg; return ret * rad2deg;

View File

@@ -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, float roll = 0.f); static QVector3D fromDirection(QVector3D d, float pitch = 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);

View File

@@ -189,6 +189,7 @@ void Camera::orbitXY(const float & a) {
//trans.rotationRef() *= QQuaternion::fromEulerAngles(a, 0, 0); //trans.rotationRef() *= QQuaternion::fromEulerAngles(a, 0, 0);
ObjectBase::rotateX(-a); ObjectBase::rotateX(-a);
move(pa - aim()); move(pa - aim());
//qDebug() << pos() << aim(); //qDebug() << pos() << aim();
/*QVector3D dv = aim_ - pos_; /*QVector3D dv = aim_ - pos_;
float tl = dv.length(), tc; float tl = dv.length(), tc;

View File

@@ -456,7 +456,8 @@ void AimedObject::setAim(const QVector3D & p) {
trans.setRotation(Transform::fromDirection(dir, trans.rotationY())); trans.setRotation(Transform::fromDirection(dir, trans.rotationY()));
aim_dist = dir.length(); aim_dist = dir.length();
buildTransform(); buildTransform();
//qDebug() << "setAim" << p << aim(); //if (!p.isNull())
//qDebug() << "setAim" << p << aim() << worldAim();
} }

View File

@@ -244,7 +244,7 @@ public:
QVector3D worldAim() const; QVector3D worldAim() const;
void setAim(const QVector3D & p); void setAim(const QVector3D & p);
QVector3D direction() const; QVector3D direction() const;
QVector3D worldDirection() const {return (itransform_ * QVector4D(direction(), 0.)).toVector3D().normalized();} QVector3D worldDirection() const {return (itransform_ * QVector4D(QVector3D(0,0,-1), 0.)).toVector3D().normalized();}
void setDirection(const QVector3D & d); void setDirection(const QVector3D & d);
void setDirection(double x, double y, double z) {setDirection(QVector3D(x, y, z));} void setDirection(double x, double y, double z) {setDirection(QVector3D(x, y, z));}
double distance() const {return aim_dist;} double distance() const {return aim_dist;}

View File

@@ -258,9 +258,9 @@ void RendererBase::reloadLightsPositions(Camera * cam) {
QGLLightPosition & so(cur_lights_pos_[i]); QGLLightPosition & so(cur_lights_pos_[i]);
Light * l = current_lights[i]; Light * l = current_lights[i];
QMatrix4x4 m = mat * l->worldTransform(); QMatrix4x4 m = mat * l->worldTransform();
QVector4D pos(0, 0, 0, 1.), dir(l->direction(), 1);//, dir0(light->dir0), dir1(light->dir1); QVector4D pos(0, 0, 0, 1.), dir(QVector3D(0,0,-1), 1);//, dir0(light->dir0), dir1(light->dir1);
pos = m * pos; pos = m * pos;
dir = (m * QVector4D(l->direction(),0)).normalized();//((m * dir) - pos).normalized(); dir = (m * QVector4D(QVector3D(0,0,-1),0)).normalized();//((m * dir) - pos).normalized();
so.position = pos; so.position = pos;
so.direction = dir; so.direction = dir;
//so.shadowMatrix = l->shadow_matrix; //so.shadowMatrix = l->shadow_matrix;

View File

@@ -190,9 +190,8 @@ void RendererService::fillSpotObjects() {
cur_objects.clear(); cur_objects.clear();
cur_aims.clear(); cur_aims.clear();
foreach (Light * l, ll) { foreach (Light * l, ll) {
QMatrix4x4 m, lm; QMatrix4x4 m;
lm = l->transform().matrixRotate(); m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l);
m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l) * lm;
m.transposed().copyDataTo(o.modelmatrix); m.transposed().copyDataTo(o.modelmatrix);
o.object_id = l->id_; o.object_id = l->id_;
cur_objects << o; cur_objects << o;
@@ -387,6 +386,7 @@ void RendererService::renderService() {
f->glViewport(0, 0, axis_viewport.width(), axis_viewport.height()); f->glViewport(0, 0, axis_viewport.width(), axis_viewport.height());
axis_camera->setPos(-r->view->camera()->direction() * 3.); axis_camera->setPos(-r->view->camera()->direction() * 3.);
axis_camera->setAim(QVector3D()); axis_camera->setAim(QVector3D());
axis_camera->setRotation(r->view->camera()->rotation());
r->setUniformCamera(prog, axis_camera, true, axis_viewport); r->setUniformCamera(prog, axis_camera, true, axis_viewport);
axis_mesh->draw(f, 3); axis_mesh->draw(f, 3);
f->glViewport(0, 0, r->view->width(), r->view->height()); f->glViewport(0, 0, r->view->width(), r->view->height());