10 #include <mrpt/core/exceptions.h>
11 #include <mrpt/maps/CSimplePointsMap.h>
12 #include <mrpt/opengl/CAssimpModel.h>
13 #include <mrpt/system/filesystem.h>
22 using namespace mvsim;
28 double thickness = 0.10;
32 World* parent,
const mrpt::math::TPoint3D& rawEnd1,
const mrpt::math::TPoint3D& rawEnd2,
35 Block::Ptr b = std::make_shared<Block>(parent);
39 b->setName(mrpt::format(
"wall_%04i", ++cnt));
42 float pt1Dist = std::numeric_limits<float>::max(), pt2Dist = std::numeric_limits<float>::max();
46 allPts.kdTreeClosestPoint2D(rawEnd1.x, rawEnd1.y, pt1Dist);
47 allPts.kdTreeClosestPoint2D(rawEnd2.x, rawEnd2.y, pt2Dist);
52 const bool end1move = pt1Dist < mrpt::square(1.01 * wp.
thickness);
53 const bool end2move = pt2Dist < mrpt::square(1.01 * wp.
thickness);
55 const auto vec12 = rawEnd2 - rawEnd1;
56 ASSERT_(vec12.norm() > 0);
57 const auto u12 = vec12.unitarize();
62 const auto end1 = end1move ? (rawEnd1 + u12 * (-
t)) : rawEnd1;
63 const auto end2 = end2move ? (rawEnd2 + u12 *
t) : rawEnd2;
65 const auto ptCenter = (end1 + end2) * 0.5;
66 const double wallLineAngle = std::atan2(vec12.y, vec12.x);
68 allPts.insertPoint(rawEnd1);
69 allPts.insertPoint(rawEnd2);
72 b->setPose({ptCenter.x, ptCenter.y, 0, wallLineAngle, 0, 0});
76 const double l_hf = 0.5 * (end2 - end1).norm();
81 auto bbmin = mrpt::math::TPoint3D(-l_hf, -t_hf, 0);
82 auto bbmax = mrpt::math::TPoint3D(+l_hf, +t_hf, 0);
84 mrpt::math::TPolygon2D p;
85 p.emplace_back(bbmin.x, bbmin.y);
86 p.emplace_back(bbmin.x, bbmax.y);
87 p.emplace_back(bbmax.x, bbmax.y);
88 p.emplace_back(bbmax.x, bbmin.y);
97 b->ground_friction(1e5);
104 b->setIsStatic(
true);
106 if (
auto bb = b->b2d_body(); bb !=
nullptr)
109 const auto q = b->getPose();
111 bb->SetTransform(
b2Vec2(q.x, q.y), q.yaw);
113 bb->SetLinearVelocity({0, 0});
114 bb->SetAngularVelocity(0);
125 ASSERT_(0 == strcmp(node.name(),
"walls"));
127 std::string wallModelFileName;
128 std::string sTransformation;
130 mrpt::img::TColor wallColor{0x32, 0x32, 0x32, 0xff};
134 params[
"model_uri"] =
TParamEntry(
"%s", &wallModelFileName);
135 params[
"transformation"] =
TParamEntry(
"%s", &sTransformation);
139 params[
"color"] =
TParamEntry(
"%color", &wallColor);
145 auto HM = mrpt::math::CMatrixDouble44::Identity();
146 if (!sTransformation.empty())
148 std::stringstream ssError;
149 bool ok = HM.fromMatlabStringFormat(sTransformation, ssError);
152 "Error parsing 'transformation=\"%s\"' parameter of walls:\n%s",
153 sTransformation.c_str(), ssError.str().c_str());
154 MRPT_LOG_DEBUG_STREAM(
"Walls: using transformation: " << HM.asString());
156 const auto tf = mrpt::poses::CPose3D(HM);
159 const auto* xml_shape = node.
first_node(
"shape");
162 std::vector<mrpt::math::TPoint3Df> tfPts;
167 mrpt::math::TPolygon2D segments;
171 MRPT_LOG_DEBUG_STREAM(
"Walls loaded from <shape> tag, " << segments.size() <<
" segments.");
174 tfPts.reserve(segments.size());
175 for (
const auto& pt : segments)
176 tfPts.emplace_back(
tf.composePoint(mrpt::math::TPoint3D(pt)));
181 ASSERT_(!wallModelFileName.empty());
182 const std::string localFileName = xmlPathToActualPath(wallModelFileName);
183 ASSERT_FILE_EXISTS_(localFileName);
185 MRPT_LOG_DEBUG_STREAM(
"Loading walls definition model from: " << localFileName);
187 auto glModel = mrpt::opengl::CAssimpModel::Create();
188 glModel->loadScene(localFileName);
190 const auto& points = glModel->shaderWireframeVertexPointBuffer();
191 MRPT_LOG_DEBUG_STREAM(
"Walls loaded from model file, " << points.size() <<
" segments.");
194 tfPts.reserve(points.size());
195 for (
const auto& pt : points) tfPts.emplace_back(
tf.composePoint(pt));
199 mrpt::maps::CSimplePointsMap ptsMap;
202 ASSERT_(tfPts.size() % 2 == 0);
203 for (
size_t i = 0; i < tfPts.size() / 2; i++)
205 const auto& pt1 = tfPts[i * 2 + 0];
206 const auto& pt2 = tfPts[i * 2 + 1];
208 block->block_color(wallColor);