collision sphere previsualization
This commit is contained in:
parent
928d45c3fb
commit
7e0554bf65
@ -3,5 +3,6 @@
|
|||||||
<qresource prefix="/mdl">
|
<qresource prefix="/mdl">
|
||||||
<file>dji600.obj</file>
|
<file>dji600.obj</file>
|
||||||
<file>dji600.mtl</file>
|
<file>dji600.mtl</file>
|
||||||
|
<file>sphere.obj</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
3210
mdl/sphere.obj
Normal file
3210
mdl/sphere.obj
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,14 +1,34 @@
|
|||||||
#include "drone_controller.hh"
|
#include "drone_controller.hh"
|
||||||
#include "opengl_widget.hh"
|
#include "opengl_widget.hh"
|
||||||
|
#include "load_obj.hh"
|
||||||
|
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QOpenGLShaderProgram>
|
#include <QOpenGLShaderProgram>
|
||||||
|
|
||||||
|
|
||||||
DroneController::DroneController(const QJsonObject &json)
|
const unsigned char DroneController::sphere_neutral[] = {
|
||||||
:framerate(json["framerate"].toInt()) {
|
166, 166, 166
|
||||||
|
};
|
||||||
|
|
||||||
|
OpenGLMesh *DroneController::sphere = nullptr;
|
||||||
|
|
||||||
|
|
||||||
|
DroneController::DroneController(const QJsonObject &json)
|
||||||
|
:framerate(json["framerate"].toInt()),
|
||||||
|
sphere_timer(this) {
|
||||||
|
sphere_timer.setSingleShot(true);
|
||||||
|
connect(&sphere_timer, &QTimer::timeout, [&]() {
|
||||||
|
draw_spheres = false;
|
||||||
|
OpenGLWidget::instance->update();
|
||||||
|
});
|
||||||
|
if (sphere == nullptr) {
|
||||||
|
OpenGLWidget::instance->makeCurrent();
|
||||||
|
sphere = new OpenGLMesh(load_obj(":/mdl/sphere.obj", LOAD_OBJ_NORMALS | LOAD_OBJ_UVS),
|
||||||
|
new QOpenGLTexture(QImage(sphere_neutral, 1, 1, QImage::Format_RGB888)),
|
||||||
|
OpenGLWidget::instance->getMainProgram());
|
||||||
|
OpenGLWidget::instance->makeCurrent();
|
||||||
|
}
|
||||||
QJsonArray ja = json["drones"].toArray();
|
QJsonArray ja = json["drones"].toArray();
|
||||||
drones.reserve(ja.size());
|
drones.reserve(ja.size());
|
||||||
for (const QJsonValue &o : ja) {
|
for (const QJsonValue &o : ja) {
|
||||||
@ -29,6 +49,10 @@ void DroneController::draw(QOpenGLExtraFunctions *f) const {
|
|||||||
QMatrix4x4 mat;
|
QMatrix4x4 mat;
|
||||||
mat.translate(d.getPos());
|
mat.translate(d.getPos());
|
||||||
d.getMesh()->draw(f, mat);
|
d.getMesh()->draw(f, mat);
|
||||||
|
if (draw_spheres) {
|
||||||
|
mat.scale(sphere_radius);
|
||||||
|
sphere->draw(f, mat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -111,6 +135,14 @@ void DroneController::computeCollisions(double sphere_radius) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DroneController::displaySpheres(double sphere_radius) {
|
||||||
|
draw_spheres = true;
|
||||||
|
this->sphere_radius = sphere_radius;
|
||||||
|
sphere_timer.start(1000);
|
||||||
|
OpenGLWidget::instance->update();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DroneController::collides(const Drone &a, const Drone &b, double sqDist) {
|
bool DroneController::collides(const Drone &a, const Drone &b, double sqDist) {
|
||||||
return (b.getPos() - a.getPos()).lengthSquared() < sqDist;
|
return (b.getPos() - a.getPos()).lengthSquared() < sqDist;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,12 @@ class DroneController : public QObject, public Painter {
|
|||||||
QVector<Drone> drones;
|
QVector<Drone> drones;
|
||||||
QTimer timer;
|
QTimer timer;
|
||||||
bool paused = true;
|
bool paused = true;
|
||||||
|
bool draw_spheres = false;
|
||||||
|
double sphere_radius = 0;
|
||||||
|
QTimer sphere_timer;
|
||||||
|
|
||||||
|
static OpenGLMesh *sphere;
|
||||||
|
static const unsigned char sphere_neutral[];
|
||||||
|
|
||||||
static bool collides(const Drone &a, const Drone &b, double radius);
|
static bool collides(const Drone &a, const Drone &b, double radius);
|
||||||
|
|
||||||
@ -43,6 +49,7 @@ public slots:
|
|||||||
void resume();
|
void resume();
|
||||||
void seek(int frame);
|
void seek(int frame);
|
||||||
void computeCollisions(double sphere_radius);
|
void computeCollisions(double sphere_radius);
|
||||||
|
void displaySpheres(double sphere_radius);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -87,6 +87,8 @@ void MainWindow::open(const QString &path) {
|
|||||||
[&](double _) { settings_pane->clearCollisions(); });
|
[&](double _) { settings_pane->clearCollisions(); });
|
||||||
connect(settings_pane, &SettingsPane::sphereRadiusChanged,
|
connect(settings_pane, &SettingsPane::sphereRadiusChanged,
|
||||||
dc, &DroneController::computeCollisions);
|
dc, &DroneController::computeCollisions);
|
||||||
|
connect(settings_pane, &SettingsPane::sphereRadiusChanged,
|
||||||
|
dc, &DroneController::displaySpheres);
|
||||||
settings_pane->setEnabled(true);
|
settings_pane->setEnabled(true);
|
||||||
|
|
||||||
glw.setPainter(dc);
|
glw.setPainter(dc);
|
||||||
|
@ -21,8 +21,6 @@ OpenGLMesh::OpenGLMesh(QVector<float> verts, QOpenGLTexture *tex, QOpenGLShaderP
|
|||||||
glf->glEnableVertexAttribArray(1);
|
glf->glEnableVertexAttribArray(1);
|
||||||
glf->glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof (float), (void *) (6 * sizeof (float)));
|
glf->glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof (float), (void *) (6 * sizeof (float)));
|
||||||
glf->glEnableVertexAttribArray(2);
|
glf->glEnableVertexAttribArray(2);
|
||||||
tex->bind();
|
|
||||||
glf->glBindVertexArray(0);
|
|
||||||
OpenGLWidget::instance->doneCurrent();
|
OpenGLWidget::instance->doneCurrent();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -31,7 +29,7 @@ void OpenGLMesh::draw(QOpenGLExtraFunctions *f, const QMatrix4x4 &mat) const {
|
|||||||
program->bind();
|
program->bind();
|
||||||
program->setUniformValue("model", mat);
|
program->setUniformValue("model", mat);
|
||||||
f->glBindVertexArray(vao);
|
f->glBindVertexArray(vao);
|
||||||
tex->bind();
|
if (tex) tex->bind();
|
||||||
f->glDrawArrays(GL_TRIANGLES, 0, nverts);
|
f->glDrawArrays(GL_TRIANGLES, 0, nverts);
|
||||||
tex->release();
|
if (tex) tex->release();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user