diff --git a/VirtualRobot/MathTools.h b/VirtualRobot/MathTools.h index 780f96bbcf0e9b41f4f7e7cde972e97242ab6ff5..f60e84319985ea2a57abc6d81a0f8364887179be 100644 --- a/VirtualRobot/MathTools.h +++ b/VirtualRobot/MathTools.h @@ -341,10 +341,26 @@ namespace MathTools { this->id1 = id1; this->id2 = id2; this->id3 = id3; } + void setColor(unsigned int idColor1, unsigned int idColor2, unsigned int idColor3) { + this->idColor1 = idColor1; this->idColor2 = idColor2; this->idColor3 = idColor3; + } + void setMaterial(unsigned int idMaterial) { + this->idMaterial = idMaterial; + } + // id == position in vertex array unsigned int id1; unsigned int id2; unsigned int id3; + + // idColor == position in color array + unsigned int idColor1; + unsigned int idColor2; + unsigned int idColor3; + + // idMaterial == position in material array + unsigned int idMaterial; + Eigen::Vector3f normal; }; struct TriangleFace6D diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp index 553eee8de58c6489bb18e67bd22e94ee75a48104..da7c53c1fca8fab07e0be32ac7338322ece573e0 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp @@ -736,7 +736,17 @@ namespace VirtualRobot { return pGrid; } - SoSeparator* CoinVisualizationFactory::CreatePolygonVisualization( const std::vector<Eigen::Vector3f> &points, VisualizationFactory::Color colorInner /*= VisualizationFactory::Color::Blue()*/, VisualizationFactory::Color colorLine /*= VisualizationFactory::Color::Black()*/, float lineSize /*= 4.0f*/ ) + SoSeparator* CoinVisualizationFactory::CreatePolygonVisualization( const std::vector<Eigen::Vector3f> &points, VisualizationFactory::Color colorInner, VisualizationFactory::Color colorLine, float lineSize) + { + VisualizationFactory::PhongMaterial mat; + mat.diffuse = colorInner; + mat.ambient = colorInner; + mat.transparency = colorInner.transparency; + + return CreatePolygonVisualization(points, mat, colorLine, lineSize); + } + + SoSeparator* CoinVisualizationFactory::CreatePolygonVisualization( const std::vector<Eigen::Vector3f> &points, VisualizationFactory::PhongMaterial mat, VisualizationFactory::Color colorLine, float lineSize) { SoSeparator* visu = new SoSeparator; if (points.size()==0) @@ -747,14 +757,14 @@ namespace VirtualRobot { u->units = SoUnits::MILLIMETERS; visu->addChild(u); - if (!colorInner.isNone()) - { - SoMaterial *m = new SoMaterial; - m->diffuseColor.setValue(colorInner.r, colorInner.g, colorInner.b); - m->ambientColor.setValue(colorInner.r, colorInner.g, colorInner.b); - m->transparency.setValue(colorInner.transparency); - visu->addChild(m); - } + SoMaterial *m = new SoMaterial; + m->diffuseColor.setValue(mat.diffuse.r, mat.diffuse.g, mat.diffuse.b); + m->ambientColor.setValue(mat.ambient.r, mat.ambient.g, mat.ambient.b); + m->emissiveColor.setValue(mat.emission.r, mat.emission.g, mat.emission.b); +// m->shininess.setValue(mat.shininess, mat.shininess, mat.shininess); + m->specularColor.setValue(mat.specular.r, mat.specular.g, mat.specular.b); + m->transparency.setValue(mat.transparency); + visu->addChild(m); SoCoordinate3* coordinate3 = new SoCoordinate3; SoCoordinate3* coordinate3b = new SoCoordinate3; @@ -993,7 +1003,18 @@ namespace VirtualRobot { v.push_back(v1); v.push_back(v2); v.push_back(v3); - SoSeparator* s = CreatePolygonVisualization(v,color,lineColor,lineSize); +// SoSeparator* s = CreatePolygonVisualization(v,color,lineColor,lineSize); + + VisualizationFactory::Color triColor = (model->colors.size() == 0)? color : model->colors[model->faces[i].idColor1]; + + SoSeparator* s; + if (model->materials.size() == 0) { + s = CreatePolygonVisualization(v,triColor,lineColor,lineSize); + } else { + VisualizationFactory::PhongMaterial mat = model->materials[model->faces[i].idMaterial]; + s = CreatePolygonVisualization(v, mat, lineColor,lineSize); + } + res->addChild(s); if (showNormals) { diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h index 9bfc25ba56227d329fdb1123bf8e4c91db357bb9..b4009c28613144aad8b7be558f51162ec3625b96 100644 --- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h +++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h @@ -104,6 +104,7 @@ public: static SoSeparator* CreateConvexHull2DVisualization(const MathTools::ConvexHull2DPtr ch, MathTools::Plane &p, VisualizationFactory::Color colorInner = VisualizationFactory::Color::Blue(), VisualizationFactory::Color colorLine = VisualizationFactory::Color::Black(), float lineSize = 5.0f, const Eigen::Vector3f &offset =Eigen::Vector3f::Zero() ); static SoSeparator* CreatePolygonVisualization(const std::vector<Eigen::Vector3f> &points, VisualizationFactory::Color colorInner = VisualizationFactory::Color::Blue(), VisualizationFactory::Color colorLine = VisualizationFactory::Color::Black(), float lineSize = 4.0f); + static SoSeparator* CreatePolygonVisualization(const std::vector<Eigen::Vector3f> &points, VisualizationFactory::PhongMaterial mat, VisualizationFactory::Color colorLine = VisualizationFactory::Color::Black(), float lineSize = 4.0f); static SoSeparator* CreatePlaneVisualization(const Eigen::Vector3f &position, const Eigen::Vector3f &normal, float extend, float transparency, bool grid=true, float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f, std::string textureFile = std::string()); static SoSeparator* CreateCoordSystemVisualization(float scaling = 1.0f, std::string *text = NULL, float axisLength = 100.0f, float axisSize = 3.0f, int nrOfBlocks = 10); static SoSeparator* CreateBoundingBox(SoNode* ivModel, bool wireFrame=false); diff --git a/VirtualRobot/Visualization/TriMeshModel.cpp b/VirtualRobot/Visualization/TriMeshModel.cpp index 6afc7881f8883d538e8b50d248d403c99c2e5252..4f382be731b17838c98fa73f2e56f2461411dd8e 100644 --- a/VirtualRobot/Visualization/TriMeshModel.cpp +++ b/VirtualRobot/Visualization/TriMeshModel.cpp @@ -14,7 +14,6 @@ #include <iomanip> namespace VirtualRobot { - /** * This method adds the vertices \p vertex1, * \p vertex2 and \p vertex3 to TriMeshModel::vertices and creates a new @@ -30,12 +29,16 @@ void TriMeshModel::addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f addTriangleWithFace (vertex1,vertex2,vertex3,normal); } -void TriMeshModel::addTriangleWithFace( Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal ) +void TriMeshModel::addTriangleWithFace( Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal, VisualizationFactory::Color color1, VisualizationFactory::Color color2, VisualizationFactory::Color color3 ) { this->addVertex(vertex1); this->addVertex(vertex2); this->addVertex(vertex3); + this->addColor(color1); + this->addColor(color2); + this->addColor(color3); + if (normal.norm()<1e-10) normal = TriMeshModel::CreateNormal(vertex1, vertex2, vertex3); else @@ -47,12 +50,23 @@ void TriMeshModel::addTriangleWithFace( Eigen::Vector3f& vertex1, Eigen::Vector3 face.id2 = this->vertices.size()-2; face.id3 = this->vertices.size()-1; + face.idColor1 = this->colors.size() - 3; + face.idColor2 = this->colors.size() - 2; + face.idColor3 = this->colors.size() - 1; + face.normal = normal; this->addFace(face); } - +void TriMeshModel::addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector4f& vertexColor1, Eigen::Vector4f& vertexColor2, Eigen::Vector4f& vertexColor3) +{ + Eigen::Vector3f normal = TriMeshModel::CreateNormal(vertex1, vertex2, vertex3); + VisualizationFactory::Color color1(vertexColor1(0), vertexColor1(1), vertexColor1(2), vertexColor1(4)); + VisualizationFactory::Color color2(vertexColor2(0), vertexColor2(1), vertexColor2(2), vertexColor2(4)); + VisualizationFactory::Color color3(vertexColor3(0), vertexColor3(1), vertexColor3(2), vertexColor3(4)); + addTriangleWithFace(vertex1, vertex2, vertex3, normal, color1, color2, color3); +} /** @@ -100,6 +114,27 @@ void TriMeshModel::addVertex(const Eigen::Vector3f& vertex) boundingBox.addPoint(vertex); } +/** + * This method adds a color to the internal data structure TriMeshModel::colors + */ +void TriMeshModel::addColor(const VisualizationFactory::Color& color) { + colors.push_back(color); +} + +/** + * This method converts and adds a color to the internal data structure TriMeshModel::colors + */ +void TriMeshModel::addColor(const Eigen::Vector4f& color) { + addColor(VisualizationFactory::Color(color(0), color(1), color(2), color(3))); +} + +/** + * This method converts and adds a color to the internal data structure TriMeshModel::materials + */ +void TriMeshModel::addMaterial(const VisualizationFactory::PhongMaterial& material) { + materials.push_back(material); +} + /** * This method clears the internal data structures TriMeshModel::faces and @@ -108,7 +143,9 @@ void TriMeshModel::addVertex(const Eigen::Vector3f& vertex) void TriMeshModel::clear() { vertices.clear(); + colors.clear(); faces.clear(); + materials.clear(); boundingBox.clear(); } diff --git a/VirtualRobot/Visualization/TriMeshModel.h b/VirtualRobot/Visualization/TriMeshModel.h index e6cb80afe037cd89ce3aecd1f1c65757e1f7a53e..e6da807b9d0d64ae7ef1c613c8730fd99d343f70 100644 --- a/VirtualRobot/Visualization/TriMeshModel.h +++ b/VirtualRobot/Visualization/TriMeshModel.h @@ -24,6 +24,7 @@ #define _VirtualRobot_TriMeshModel_h_ #include "../VirtualRobotImportExport.h" +#include "../Visualization/VisualizationFactory.h" #include "../MathTools.h" #include "../BoundingBox.h" #include <Eigen/Core> @@ -38,10 +39,17 @@ public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3); - void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal); + void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal, + VisualizationFactory::Color color1 = VisualizationFactory::Color::Gray(), + VisualizationFactory::Color color2 = VisualizationFactory::Color::Gray(), + VisualizationFactory::Color color3 = VisualizationFactory::Color::Gray()); + void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector4f& vertexColor1, Eigen::Vector4f& vertexColor2, Eigen::Vector4f& vertexColor3); static Eigen::Vector3f CreateNormal(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3); void addFace(const MathTools::TriangleFace& face); void addVertex(const Eigen::Vector3f& vertex); + void addColor(const VisualizationFactory::Color& color); + void addColor(const Eigen::Vector4f& color); + void addMaterial(const VisualizationFactory::PhongMaterial& material); void clear(); void flipVertexOrientations(); @@ -56,7 +64,9 @@ public: TriMeshModelPtr clone (Eigen::Vector3f &scaleFactor); std::vector<Eigen::Vector3f> vertices; + std::vector<VisualizationFactory::Color> colors; std::vector<MathTools::TriangleFace> faces; + std::vector<VisualizationFactory::PhongMaterial> materials; BoundingBox boundingBox; }; } // namespace VirtualRobot diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h index 9d9a93e401588741396800c40a0c619c358a342e..7788432d527821fa4aaa60737ba6d69c38f74d3a 100644 --- a/VirtualRobot/Visualization/VisualizationFactory.h +++ b/VirtualRobot/Visualization/VisualizationFactory.h @@ -43,7 +43,7 @@ public: struct Color { Color(){transparency=0.0f;r=g=b=0.5f;} - Color(float r, float g, float b, float transparency):r(r),g(g),b(b),transparency(transparency){} + Color(float r, float g, float b, float transparency = 0.0f):r(r),g(g),b(b),transparency(transparency){} float r,g,b; float transparency; bool isNone() const {return transparency>=1.0f;} @@ -55,6 +55,21 @@ public: static Color None(){return Color(0.0f,0.0f,0.0f,1.0f);} }; + struct PhongMaterial + { + PhongMaterial(){}; + Color emission; + Color ambient; + Color diffuse; + Color specular; + float shininess; + Color reflective; + float reflectivity; + Color transparent; + float transparency; + float refractionIndex; + }; + VisualizationFactory() {;} virtual ~VisualizationFactory() {;}