collision sphere previsualization

This commit is contained in:
ccolin 2021-01-03 13:27:01 +01:00
parent 928d45c3fb
commit 7e0554bf65
6 changed files with 3256 additions and 6 deletions

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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;
} }

View File

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

View File

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

View File

@ -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();
} }