From c195e736f699ea8a2ca29a41893563463aac4fb9 Mon Sep 17 00:00:00 2001 From: Paul Leroy Date: Wed, 27 Mar 2024 21:33:58 +0100 Subject: [PATCH] axis orientation modified + code cleaning the largest axis is the 'z' axis of the grain --- include/GrainsAsEllipsoids.h | 5 --- src/ActionA.cpp | 3 ++ src/GrainsAsEllipsoids.cpp | 65 +++++++++++++++++------------------- 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/include/GrainsAsEllipsoids.h b/include/GrainsAsEllipsoids.h index 566f459..bbbc21d 100644 --- a/include/GrainsAsEllipsoids.h +++ b/include/GrainsAsEllipsoids.h @@ -38,12 +38,9 @@ public: void initSphereIndexes(); - void buildInterleavedVertices(); - std::vector vertices; std::vector normals; std::vector texCoords; - std::vector interleavedVertices; std::vector indices; std::vector lineIndices; @@ -51,8 +48,6 @@ public: int sectorCount{21}; int stackCount{21}; - int interleavedStride = 32; - // ELLIPSOID FITTING enum Method{ diff --git a/src/ActionA.cpp b/src/ActionA.cpp index 020f313..2862504 100644 --- a/src/ActionA.cpp +++ b/src/ActionA.cpp @@ -70,7 +70,10 @@ void G3PointAction::GetG3PointAction(ccPointCloud *cloud, ccMainAppInterface *ap } s_g3PointAction->showDlg(); s_g3PointAction->init(); + + // do actions immediately for debug s_g3PointAction->segment(); + s_g3PointAction->fit(); } RGBAColorsTableType getRandomColors(int randomColorsNumber) diff --git a/src/GrainsAsEllipsoids.cpp b/src/GrainsAsEllipsoids.cpp index 9a58cee..10e13ce 100644 --- a/src/GrainsAsEllipsoids.cpp +++ b/src/GrainsAsEllipsoids.cpp @@ -116,7 +116,6 @@ void GrainsAsEllipsoids::initSphereVertices() texCoords.push_back(t); } } - ccLog::Print("vertices.size() " + QString::number(vertices.size())); } void GrainsAsEllipsoids::initSphereIndexes() @@ -165,27 +164,6 @@ void GrainsAsEllipsoids::initSphereIndexes() } } -void GrainsAsEllipsoids::buildInterleavedVertices() -{ - std::vector().swap(interleavedVertices); - - std::size_t i, j; - std::size_t count = vertices.size(); - for(i = 0, j = 0; i < count; i += 3, j += 2) - { - interleavedVertices.push_back(vertices[i]); - interleavedVertices.push_back(vertices[i+1]); - interleavedVertices.push_back(vertices[i+2]); - - interleavedVertices.push_back(normals[i]); - interleavedVertices.push_back(normals[i+1]); - interleavedVertices.push_back(normals[i+2]); - - interleavedVertices.push_back(texCoords[j]); - interleavedVertices.push_back(texCoords[j+1]); - } -} - // ELLIPSOID FITTING double GrainsAsEllipsoids::ellipsoidDistance(const Eigen::ArrayXd& p, int idx) @@ -534,6 +512,31 @@ bool GrainsAsEllipsoids::fitEllipsoidToGrain(const int grainIndex, center = center / scale + Eigen::Array3f(means.cast()); radii = radii / scale; + // re-order the radii + std::vector sortedRadii{radii(0), radii(1), radii(2)}; + std::sort(sortedRadii.begin(), sortedRadii.end()); + Eigen::Array3f updatedRadii = {sortedRadii[0], sortedRadii[1], sortedRadii[2]}; // from the smallest to the largest + Eigen::Matrix3f updatedRotationMatrix; + for (int k = 0; k < 3; k++) + { + float radius = updatedRadii(k); + int col = 0; + for (int idx = 0; idx < 3; idx++) + { + if (radii[idx] == radius) + { + break; + } + col++; + } + updatedRotationMatrix(k, 0) = rotationMatrix(col, 0); + updatedRotationMatrix(k, 1) = rotationMatrix(col, 1); + updatedRotationMatrix(k, 2) = rotationMatrix(col, 2); + } + + radii = updatedRadii; + rotationMatrix = updatedRotationMatrix; + ret = explicitToImplicit(center, radii, rotationMatrix, p); return ret; @@ -574,15 +577,6 @@ bool GrainsAsEllipsoids::initProgram(QOpenGLContext* context) return false; } - // create geometry shader - // QString geometryShaderFile(m_shaderPath + "/DrawGrains.gs"); - // if (!m_program->addShaderFromSourceFile(QOpenGLShader::Geometry, geometryShaderFile)) - // { - // error = m_program->log(); - // ccLog::Error(error); - // return false; - // } - // create fragment shader QString fragmentShaderFile(m_shaderPath + "/DrawGrains.fs"); if (!m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, fragmentShaderFile)) @@ -620,7 +614,6 @@ bool GrainsAsEllipsoids::initProgram(QOpenGLContext* context) // initialize sphere initSphereVertices(); initSphereIndexes(); - buildInterleavedVertices(); } return true; @@ -666,9 +659,13 @@ void GrainsAsEllipsoids::drawEllipsoid(CC_DRAW_CONTEXT& context, int idx) { m_program->setUniformValue("drawLines", 0); m_program->setUniformValue("drawPoints", 0); + glFunc->glEnable(GL_POLYGON_OFFSET_FILL); + glFunc->glPolygonOffset(1.0, 1.0f); // move polygon backward + glFunc->glDrawElements(GL_TRIANGLES, (unsigned int) indices.size(), GL_UNSIGNED_INT, indices.data()); + glFunc->glDisable(GL_POLYGON_OFFSET_FILL); } @@ -677,8 +674,7 @@ void GrainsAsEllipsoids::drawEllipsoid(CC_DRAW_CONTEXT& context, int idx) { m_program->setUniformValue("drawLines", 1); m_program->setUniformValue("drawPoints", 0); - glFunc->glDisable(GL_LIGHTING); - glFunc->glDisable(GL_TEXTURE_2D); + glFunc->glDrawElements(GL_LINES, (unsigned int)lineIndices.size(), GL_UNSIGNED_INT, lineIndices.data()); } @@ -765,6 +761,7 @@ bool GrainsAsEllipsoids::drawEllipsoids(CC_DRAW_CONTEXT& context) glFunc->glEnable(GL_VERTEX_PROGRAM_POINT_SIZE); glFunc->glDisable(GL_LIGHTING); glFunc->glDisable(GL_TEXTURE_2D); + glFunc->glDrawArrays(GL_POINTS, 0, stack.size()); // reset the vertex positions to the template sphere