draw ellipsoids of different sizes, positions and orientations

This commit is contained in:
Paul Leroy
2024-03-19 21:47:18 +01:00
parent 99d93ef114
commit f7025e0f9c
5 changed files with 78 additions and 24 deletions
+2 -2
View File
@@ -39,7 +39,7 @@ public:
bool drawSphere(CC_DRAW_CONTEXT &context, int colorIndex=0);
void setGrainColorsTable(QSharedPointer<RGBAColorsTableType> colorTable);
void setGrainColorsTable(const RGBAColorsTableType& colorTable);
std::vector<float> vertices;
std::vector<float> normals;
@@ -82,7 +82,7 @@ public:
ccPointCloud* m_cloud;
ccMainAppInterface* m_app;
Eigen::ArrayXi m_localMaximumIndexes;
QSharedPointer<RGBAColorsTableType> m_grainColors;
std::vector<CCVector3f> m_grainColors;
std::vector<CCVector3f> m_ellipsoidInstance;
Eigen::ArrayX3f ellipsoidInstance;
+13 -3
View File
@@ -9,13 +9,14 @@ uniform vec4 materialAmbient; // material ambient color
uniform vec4 materialDiffuse; // material diffuse color
uniform vec4 materialSpecular; // material specular color
uniform float materialShininess; // material specular shininess
uniform bool drawLines; //
// varyings (input)
// in
in vec3 esVertex;
in vec3 esNormal;
in vec2 texCoord0;
// output
// out
out vec4 fragColor;
void main()
@@ -32,11 +33,20 @@ void main()
}
vec3 view = normalize(-esVertex);
vec3 reflectVec = reflect(-light, normal); // 2 * N * (N dot L) - L
vec3 color = lightAmbient.rgb * materialAmbient.rgb; // begin with ambient
float dotNL = max(dot(normal, light), 0.0);
color += lightDiffuse.rgb * materialDiffuse.rgb * dotNL; // add diffuse
float dotVR = max(dot(view, reflectVec), 0.0);
color += pow(dotVR, materialShininess) * lightSpecular.rgb * materialSpecular.rgb; // add specular
fragColor = vec4(color, materialDiffuse.a); // set frag color
if (drawLines)
{
fragColor = vec4(materialAmbient.rgb * vec3(0.8, 0.8, 0.8), materialDiffuse.a);
}
else
{
fragColor = vec4(materialAmbient.rgb, materialDiffuse.a);
}
}
+5 -5
View File
@@ -5,22 +5,22 @@ uniform mat4 modelViewMatrix;
uniform mat4 normalMatrix;
uniform mat4 modelViewProjectionMatrix;
uniform vec3 center;
uniform int instanceId;
// vertex attribs (input)
// in
in vec3 vertexPosition;
in vec3 vertexNormal;
in vec2 vertexTexCoord;
// varyings (output)
// out
out vec3 esVertex;
out vec3 esNormal;
out vec2 texCoord0;
void main()
{
esVertex = vec3(modelViewMatrix * vec4(vertexPosition + center, 1.0));
esVertex = vec3(modelViewMatrix * vec4(vertexPosition, 1.0));
esNormal = vec3(normalMatrix * vec4(vertexNormal, 1.0));
texCoord0 = vertexTexCoord;
gl_PointSize = 5;
gl_Position = modelViewProjectionMatrix * vec4(vertexPosition + center, 1.0);
gl_Position = modelViewProjectionMatrix * vec4(vertexPosition, 1.0);
}
+1 -2
View File
@@ -84,7 +84,6 @@ RGBAColorsTableType getRandomColors(int randomColorsNumber)
//generate random colors
int max = 255;
std::mt19937 gen(42); // to seed mersenne twister.
std::uniform_int_distribution<uint16_t> dist(0, max); //1-byte types are not allowed
@@ -1644,7 +1643,7 @@ void G3PointAction::segment()
m_grainsAsEllipsoids = new GrainsAsEllipsoids(m_cloud, m_app);
m_grainsAsEllipsoids->setLocalMaximumIndexes(m_localMaximumIndexes);
m_grainColors.reset(new RGBAColorsTableType(getRandomColors(m_localMaximumIndexes.size())));
m_grainsAsEllipsoids->setGrainColorsTable(m_grainColors);
m_grainsAsEllipsoids->setGrainColorsTable(*m_grainColors);
m_grainsAsEllipsoids->setName("grains as ellipsoids");
m_app->addToDB(m_grainsAsEllipsoids);
+57 -12
View File
@@ -5,6 +5,7 @@
#include <QOpenGLShaderProgram>
#include <iostream>
#include <random>
GrainsAsEllipsoids::GrainsAsEllipsoids(ccPointCloud *cloud, ccMainAppInterface *app)
: m_cloud(cloud)
@@ -226,11 +227,10 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex)
QOpenGLFunctions_2_1* glFunc = context.glFunctions<QOpenGLFunctions_2_1>();
assert(glFunc != nullptr);
const CCVector3f* center = m_cloud->getPoint(m_localMaximumIndexes[0]);
ccColor::Rgba color;
if (colorIndex < m_grainColors->size())
CCVector3f color;
if (colorIndex < m_grainColors.size())
{
color = m_grainColors->data()[colorIndex];
color = m_grainColors[colorIndex];
}
else
{
@@ -239,7 +239,6 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex)
}
// set uniforms
m_program->setUniformValue("center", center->x, center->y, center->z);
QVector4D lightPosition(0, 0, 1, 0);
QVector4D lightAmbient(0.3f, 0.3f, 0.3f, 1); // grey
QVector4D lightDiffuse(0.7f, 0.7f, 0.7f, 1); // light grey
@@ -247,7 +246,7 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex)
// QVector4D materialAmbient(0.5f, 0.5f, 0.5f, 1);
QVector4D materialDiffuse(0.7f, 0.7f, 0.7f, 1);
QVector4D materialSpecular(0.4f, 0.4f, 0.4f, 1);
QVector4D materialAmbient(static_cast<float>(color.r) / ccColor::MAX, static_cast<float>(color.g) / ccColor::MAX, static_cast<float>(color.b) / ccColor::MAX, 1);
QVector4D materialAmbient(color.x, color.y, color.z, 1);
// QVector4D materialDiffuse(color.r / ccColor::MAX, color.g / ccColor::MAX, color.b / ccColor::MAX, 1);
// QVector4D materialSpecular(color.r / ccColor::MAX, color.g / ccColor::MAX, color.b / ccColor::MAX, 1);
float materialShininess = 16;
@@ -256,7 +255,6 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex)
m_program->setUniformValue("lightAmbient", lightAmbient);
m_program->setUniformValue("lightDiffuse", lightDiffuse);
m_program->setUniformValue("lightSpecular", lightSpecular);
m_program->setUniformValue("materialAmbient", materialAmbient);
m_program->setUniformValue("materialDiffuse", materialDiffuse);
m_program->setUniformValue("materialSpecular", materialSpecular);
m_program->setUniformValue("materialShininess", materialShininess);
@@ -269,9 +267,48 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex)
m_program->enableAttributeArray("vertexNormal");
m_program->enableAttributeArray("vertexTexCoord");
glFunc->glEnable(GL_PROGRAM_POINT_SIZE);
setUniformValueColor(ccColor::yellow);
glFunc->glDrawElements(GL_TRIANGLES, (unsigned int)indices.size(), GL_UNSIGNED_INT, indices.data());
QMatrix4x4 projection;
QMatrix4x4 modelView;
//generate random colors
std::mt19937 gen(42); // to seed mersenne twister.
std::uniform_real_distribution<> dis(0.5, 1.0);
std::uniform_real_distribution<> dis2(-1., 1.0);
for (int k = 0; k < m_localMaximumIndexes.size(); k++)
{
const CCVector3f* center = m_cloud->getPoint(m_localMaximumIndexes[k]);
m_program->setUniformValue("center", center->x, center->y, center->z);
CCVector3f color = m_grainColors[k];
m_program->setUniformValue("materialAmbient", color.x, color.y, color.z, 1);
glFunc->glPushMatrix(); // save the current matrix
// translate
glFunc->glTranslatef(center->x, center->y, center->z);
// rotate
glFunc->glRotatef(90, static_cast<float>(dis2(gen)), static_cast<float>(dis2(gen)), static_cast<float>(dis2(gen)));
// scale
glFunc->glScalef(static_cast<float>(dis(gen)), static_cast<float>(dis(gen)), static_cast<float>(dis(gen)));
// get matrices
glFunc->glGetFloatv(GL_PROJECTION_MATRIX, projection.data());
glFunc->glGetFloatv(GL_MODELVIEW_MATRIX, modelView.data());
m_program->setUniformValue("modelViewProjectionMatrix", projection * modelView);
// draw triangles
m_program->setUniformValue("drawLines", 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);
// draw lines
m_program->setUniformValue("drawLines", 1);
glFunc->glDisable(GL_LIGHTING);
glFunc->glDisable(GL_TEXTURE_2D);
glFunc->glDrawElements(GL_LINES, (unsigned int)lineIndices.size(), GL_UNSIGNED_INT, lineIndices.data());
glFunc->glPopMatrix();
}
m_program->disableAttributeArray("vertexPosition");
m_program->disableAttributeArray("vertexNormal");
@@ -280,9 +317,17 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex)
return true;
}
void GrainsAsEllipsoids::setGrainColorsTable(QSharedPointer<RGBAColorsTableType> colorTable)
void GrainsAsEllipsoids::setGrainColorsTable(const RGBAColorsTableType& colorTable)
{
m_grainColors = colorTable;
m_grainColors.resize(colorTable.size());
for (int k = 0; k < colorTable.size(); k++)
{
ccColor::Rgba color = colorTable[k];
m_grainColors[k] = CCVector3f(static_cast<float>(color.r) / ccColor::MAX,
static_cast<float>(color.g) / ccColor::MAX,
static_cast<float>(color.b) / ccColor::MAX);
}
}
void GrainsAsEllipsoids::setUniformValueColor(const ccColor::Rgba &color)