diff --git a/source/RobotAPI/components/ArViz/CMakeLists.txt b/source/RobotAPI/components/ArViz/CMakeLists.txt index abef16bad1546466c10c7bd2ed11d3e58d6e2244..bdc666ed554c8acacd87d57ced6f0c2c3e12d144 100644 --- a/source/RobotAPI/components/ArViz/CMakeLists.txt +++ b/source/RobotAPI/components/ArViz/CMakeLists.txt @@ -38,6 +38,7 @@ Coin/ElementVisualizer.h # Inventor Coin/VisualizationBox.h Coin/VisualizationCylinder.h +Coin/VisualizationEllipsoid.h Coin/VisualizationSphere.h Coin/VisualizationPose.h Coin/VisualizationLine.h diff --git a/source/RobotAPI/components/ArViz/Client/Elements.h b/source/RobotAPI/components/ArViz/Client/Elements.h index 02d2c5b10fea35b8e3d7961da0a9c3e8a9dd517d..63239bc47c03173cb254846f47035e7ffed79efe 100644 --- a/source/RobotAPI/components/ArViz/Client/Elements.h +++ b/source/RobotAPI/components/ArViz/Client/Elements.h @@ -153,12 +153,46 @@ namespace armarx::viz } }; + + class Ellipsoid : public ElementOps<Ellipsoid, data::ElementEllipsoid> + { + public: + Ellipsoid(const std::string& name) : + ElementOps(name) + { + data_->curvature.e0 = 1; + data_->curvature.e1 = 1; + data_->curvature.e2 = 1; + } + + Ellipsoid& size(const Eigen::Vector3f& size) + { + data_->size.e0 = size.x(); + data_->size.e1 = size.y(); + data_->size.e2 = size.z(); + + return *this; + } + + Ellipsoid& curvature(const Eigen::Vector3f& curvature) + { + ARMARX_WARNING << "Stub! Curvature not yet implemented. Has no effect."; + data_->curvature.e0 = curvature.x(); + data_->curvature.e1 = curvature.y(); + data_->curvature.e2 = curvature.z(); + + return *this; + } + }; + + class Pose : public ElementOps<Pose, data::ElementPose> { public: using ElementOps::ElementOps; }; + class Text : public ElementOps<Text, data::ElementText> { public: diff --git a/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp b/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp index 69e20c6d03134b0dcde38a7293dca106d503b679..70d49b71bd6159b632e584725154bb966fe7e1b7 100644 --- a/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp +++ b/source/RobotAPI/components/ArViz/Coin/RegisterVisualizationTypes.cpp @@ -3,6 +3,7 @@ #include "VisualizationBox.h" #include "VisualizationCylinder.h" #include "VisualizationSphere.h" +#include "VisualizationEllipsoid.h" #include "VisualizationPose.h" #include "VisualizationLine.h" #include "VisualizationText.h" @@ -19,11 +20,12 @@ void armarx::viz::CoinVisualizer::registerVisualizationTypes() { using namespace armarx::viz::coin; - elementVisualizers.reserve(13); + elementVisualizers.reserve(14); registerVisualizerFor<VisualizationBox>(); registerVisualizerFor<VisualizationCylinder>(); registerVisualizerFor<VisualizationSphere>(); + registerVisualizerFor<VisualizationEllipsoid>(); registerVisualizerFor<VisualizationPose>(); registerVisualizerFor<VisualizationLine>(); registerVisualizerFor<VisualizationText>(); diff --git a/source/RobotAPI/components/ArViz/Coin/VisualizationEllipsoid.h b/source/RobotAPI/components/ArViz/Coin/VisualizationEllipsoid.h new file mode 100644 index 0000000000000000000000000000000000000000..5d95205013a3695c764f94710a504db4d67370c5 --- /dev/null +++ b/source/RobotAPI/components/ArViz/Coin/VisualizationEllipsoid.h @@ -0,0 +1,59 @@ +#pragma once + +#include "ElementVisualizer.h" + +#include <RobotAPI/interface/ArViz/Elements.h> +#include <Inventor/nodes/SoCone.h> +#include <Inventor/nodes/SoCylinder.h> +#include <Inventor/nodes/SoSphere.h> +#include <Inventor/nodes/SoTranslation.h> + +#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h> +#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h> + +namespace armarx::viz::coin +{ + struct VisualizationEllipsoid : TypedElementVisualization<SoSeparator> + { + using ElementType = data::ElementEllipsoid; + + bool update(ElementType const& element) + { + auto color = element.color; + constexpr float conv = 1.0f / 255.0f; + const float r = color.r * conv; + const float g = color.g * conv; + const float b = color.b * conv; + const float a = color.a * conv; + + VirtualRobot::VisualizationNodePtr ellipsoid_node; + { + // Params. + SoMaterial* mat = new SoMaterial; + mat->diffuseColor.setValue(r, g, b); + mat->ambientColor.setValue(r, g, b); + mat->transparency.setValue(1. - a); + const bool show_axes = false; // Do not show axes. If needed, draw a Pose instead. + + SoSeparator* res = new SoSeparator(); + res->ref(); + SoUnits* u = new SoUnits(); + u->units = SoUnits::MILLIMETERS; + res->addChild(u); + res->addChild(VirtualRobot::CoinVisualizationFactory::CreateEllipse( + element.size.e0, element.size.e1, element.size.e2, mat, + show_axes)); + ellipsoid_node.reset(new VirtualRobot::CoinVisualizationNode(res)); + res->unref(); + } + + SoNode* ellipsoid = dynamic_cast<VirtualRobot::CoinVisualizationNode&>( + *ellipsoid_node).getCoinVisualization(); + + node->removeAllChildren(); + node->addChild(ellipsoid); + + return true; + } + }; +} diff --git a/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp b/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp index 4df1b1f39bc32b133a0273d5408eed51c7a99672..e508a784442a3270c8cc77614e88030a02fa6f84 100644 --- a/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp +++ b/source/RobotAPI/components/ArViz/Example/ArVizExample.cpp @@ -69,6 +69,17 @@ namespace armarx layer.add(box); } + { + const float pos_y = 100. * std::cos(timeInSeconds); + const Eigen::Vector3f pos{0.f, pos_y, 150.f}; + + viz::Ellipsoid ell = viz::Ellipsoid{"ellipsoid"} + .position(pos) + .color(viz::Color::blue()) + .size(Eigen::Vector3f{50, 50, 100}); + + layer.add(ell); + } { Eigen::Vector3f pos = Eigen::Vector3f::Zero(); pos.y() = 100.0f * std::sin(timeInSeconds); diff --git a/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp b/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp index 14fbb8bb3d7312775ffdd9f2adbc1bee41bae56f..1b1285ee98b15b3b96740deda472bab749401c73 100644 --- a/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp +++ b/source/RobotAPI/components/ArViz/Introspection/json_elements.cpp @@ -187,6 +187,20 @@ namespace armarx::viz } + void data::to_json(nlohmann::json& j, const ElementEllipsoid& ellipsoid) + { + json::to_json_base(j, ellipsoid); + j["size"] = ellipsoid.size; + j["curvature"] = ellipsoid.curvature; + } + void data::from_json(const nlohmann::json& j, ElementEllipsoid& ellipsoid) + { + json::from_json_base(j, ellipsoid); + ellipsoid.size = j.at("size"); + ellipsoid.curvature = j.at("curvature"); + } + + void data::to_json(nlohmann::json& j, const ElementText& text) { json::to_json_base(j, text); diff --git a/source/RobotAPI/components/ArViz/Introspection/json_elements.h b/source/RobotAPI/components/ArViz/Introspection/json_elements.h index 15b59b676460333496c39d6410b76a46067214c0..161017340c7d83bdb91d23e79eec9ccb81ae36bf 100644 --- a/source/RobotAPI/components/ArViz/Introspection/json_elements.h +++ b/source/RobotAPI/components/ArViz/Introspection/json_elements.h @@ -74,6 +74,10 @@ namespace armarx::viz::data void from_json(const nlohmann::json& j, ElementSphere& sphere); + void to_json(nlohmann::json& j, const ElementEllipsoid& sphere); + void from_json(const nlohmann::json& j, ElementEllipsoid& sphere); + + void to_json(nlohmann::json& j, const ElementText& text); void from_json(const nlohmann::json& j, ElementText& text); diff --git a/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp b/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp index f5b2b44c45fc8bab1c5baaba22dcbcc507e846b7..d839d39d681f2b1ce875f3171919030f18683f54 100644 --- a/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp +++ b/source/RobotAPI/components/ArViz/Introspection/register_element_json_serializers.cpp @@ -8,6 +8,7 @@ void armarx::viz::json::ElementJsonSerializers::registerElements() registerSerializer<data::ElementArrowCircle>(viz::data::to_json, viz::data::from_json); registerSerializer<data::ElementBox>(viz::data::to_json, viz::data::from_json); registerSerializer<data::ElementCylinder>(viz::data::to_json, viz::data::from_json); + registerSerializer<data::ElementEllipsoid>(viz::data::to_json, viz::data::from_json); registerSerializer<data::ElementLine>(viz::data::to_json, viz::data::from_json); registerSerializer<data::ElementMesh>(viz::data::to_json, viz::data::from_json); registerSerializer<data::ElementObject>(viz::data::to_json, viz::data::from_json); diff --git a/source/RobotAPI/interface/ArViz/Elements.ice b/source/RobotAPI/interface/ArViz/Elements.ice index d0da8aefa748a7fc55bf072c2b7f151de9fce3c1..4b13ca3e1fafdbe6565295185e3d8e8870cd55d5 100644 --- a/source/RobotAPI/interface/ArViz/Elements.ice +++ b/source/RobotAPI/interface/ArViz/Elements.ice @@ -67,6 +67,12 @@ module data float radius = 10.0f; }; + class ElementEllipsoid extends Element + { + Vector3f size; + Vector3f curvature; + }; + class ElementCylinder extends Element { float height = 10.0f;