added floorplan support for object-sizing

added floorplan support for different wall-heights
minor fixes/changes
This commit is contained in:
k-a-z-u
2018-07-04 20:28:15 +02:00
parent fb8061125f
commit 19d9ce3961
10 changed files with 58 additions and 18 deletions

View File

@@ -349,8 +349,9 @@ namespace Floorplan {
Point2 from; Point2 from;
Point2 to; Point2 to;
float thickness_m; float thickness_m;
FloorObstacleLine(const ObstacleType type, const Material material, const Point2 from, const Point2 to, const float thickness_m = 0.2f) : FloorObstacle(material), type(type), from(from), to(to), thickness_m(thickness_m) {;} float height_m = 0; // 0 = floor's height
FloorObstacleLine(const ObstacleType type, const Material material, const float x1, const float y1, const float x2, const float y2, const float thickness_m = 0.2f) : FloorObstacle(material), type(type), from(x1,y1), to(x2,y2), thickness_m(thickness_m) {;} FloorObstacleLine(const ObstacleType type, const Material material, const Point2 from, const Point2 to, const float thickness_m = 0.2f, const float height_m = 0) : FloorObstacle(material), type(type), from(from), to(to), thickness_m(thickness_m), height_m(height_m) {;}
FloorObstacleLine(const ObstacleType type, const Material material, const float x1, const float y1, const float x2, const float y2, const float thickness_m = 0.2f, const float height_m = 0) : FloorObstacle(material), type(type), from(x1,y1), to(x2,y2), thickness_m(thickness_m), height_m(height_m) {;}
}; };
/** circle obstacle */ /** circle obstacle */
@@ -380,7 +381,8 @@ namespace Floorplan {
std::string file; std::string file;
Point3 pos; Point3 pos;
Point3 rot; Point3 rot;
FloorObstacleObject(const std::string& file, const Point3 pos, const Point3 rot) : file(file), pos(pos), rot(rot) {;} Point3 scale = Point3(1,1,1);
FloorObstacleObject(const std::string& file, const Point3 pos, const Point3 rot, const Point3 scale) : file(file), pos(pos), rot(rot), scale(scale) {;}
}; };

View File

@@ -403,7 +403,8 @@ namespace Floorplan {
parseMaterial(el->Attribute("material")), parseMaterial(el->Attribute("material")),
el->FloatAttribute("x1"), el->FloatAttribute("y1"), el->FloatAttribute("x1"), el->FloatAttribute("y1"),
el->FloatAttribute("x2"), el->FloatAttribute("y2"), el->FloatAttribute("x2"), el->FloatAttribute("y2"),
(el->FloatAttribute("thickness") > 0) ? (el->FloatAttribute("thickness")) : (0.15) // default wall thickness in m (el->FloatAttribute("thickness") > 0) ? (el->FloatAttribute("thickness")) : (0.15), // default wall thickness in m
el->FloatAttribute("height")
); );
} }
@@ -433,7 +434,8 @@ namespace Floorplan {
return new FloorObstacleObject( return new FloorObstacleObject(
el->Attribute("file"), el->Attribute("file"),
Point3(el->FloatAttribute("x"), el->FloatAttribute("y"), el->FloatAttribute("z")), Point3(el->FloatAttribute("x"), el->FloatAttribute("y"), el->FloatAttribute("z")),
Point3(el->FloatAttribute("rx"), el->FloatAttribute("ry"), el->FloatAttribute("rz")) Point3(el->FloatAttribute("rx", 0), el->FloatAttribute("ry", 0), el->FloatAttribute("rz", 0)),
Point3(el->FloatAttribute("sx", 1), el->FloatAttribute("sy", 1), el->FloatAttribute("sz", 1))
); );
} }

View File

@@ -334,6 +334,7 @@ namespace Floorplan {
obstacle->SetAttribute("x2", line->to.x); obstacle->SetAttribute("x2", line->to.x);
obstacle->SetAttribute("y2", line->to.y); obstacle->SetAttribute("y2", line->to.y);
obstacle->SetAttribute("thickness", line->thickness_m); obstacle->SetAttribute("thickness", line->thickness_m);
if (line->height_m != 0) {obstacle->SetAttribute("height", line->height_m);}
obstacles->InsertEndChild(obstacle); obstacles->InsertEndChild(obstacle);
} }
@@ -344,7 +345,7 @@ namespace Floorplan {
obstacle->SetAttribute("cx", circle->center.x); obstacle->SetAttribute("cx", circle->center.x);
obstacle->SetAttribute("cy", circle->center.y); obstacle->SetAttribute("cy", circle->center.y);
obstacle->SetAttribute("radius", circle->radius); obstacle->SetAttribute("radius", circle->radius);
obstacle->SetAttribute("height", circle->height); if (circle->height != 0) {obstacle->SetAttribute("height", circle->height);}
obstacles->InsertEndChild(obstacle); obstacles->InsertEndChild(obstacle);
} }
@@ -369,9 +370,12 @@ namespace Floorplan {
obstacle->SetAttribute("x", obj->pos.x); obstacle->SetAttribute("x", obj->pos.x);
obstacle->SetAttribute("y", obj->pos.y); obstacle->SetAttribute("y", obj->pos.y);
obstacle->SetAttribute("z", obj->pos.z); obstacle->SetAttribute("z", obj->pos.z);
obstacle->SetAttribute("rx", obj->rot.x); if (obj->rot.x != 0) {obstacle->SetAttribute("rx", obj->rot.x);}
obstacle->SetAttribute("ry", obj->rot.y); if (obj->rot.y != 0) {obstacle->SetAttribute("ry", obj->rot.y);}
obstacle->SetAttribute("rz", obj->rot.z); if (obj->rot.z != 0) {obstacle->SetAttribute("rz", obj->rot.z);}
if (obj->scale.x != 1) {obstacle->SetAttribute("sx", obj->scale.x);}
if (obj->scale.y != 1) {obstacle->SetAttribute("sy", obj->scale.y);}
if (obj->scale.z != 1) {obstacle->SetAttribute("sz", obj->scale.z);}
obstacles->InsertEndChild(obstacle); obstacles->InsertEndChild(obstacle);
} }

View File

@@ -47,6 +47,14 @@ public:
return *this; return *this;
} }
/** scale using 3 individual components */
Triangle3& operator *= (const Point3 o) {
p1 *= o;
p2 *= o;
p3 *= o;
return *this;
}
Point3 getNormal() const { Point3 getNormal() const {
return cross( p2-p1, p3-p1 ).normalized(); return cross( p2-p1, p3-p1 ).normalized();
} }

View File

@@ -52,6 +52,7 @@ private:
bool _buildStairs = true; bool _buildStairs = true;
bool _removeIsolated = true; bool _removeIsolated = true;
bool _addTightToObstacle = false; bool _addTightToObstacle = false;
bool _abortOnError = true;
public: public:
@@ -60,6 +61,8 @@ public:
} }
void setAbortOnError(const bool abort) {this->_abortOnError = abort;}
void setAddTightToObstacle(const bool tight) {this->_addTightToObstacle = tight;} void setAddTightToObstacle(const bool tight) {this->_addTightToObstacle = tight;}
/** whether or not to build stairs */ /** whether or not to build stairs */
@@ -181,7 +184,9 @@ public:
// belongs to a "add" polygon? -> remember until all polygons were checked // belongs to a "add" polygon? -> remember until all polygons were checked
// [might still belong to a "remove" polygon] // [might still belong to a "remove" polygon]
res.outdoor = poly->outdoor; if (poly->outdoor) {
res.outdoor = true; // belonging to an outdoor region overwrites all other belongings
}
} }
} }
@@ -219,7 +224,7 @@ public:
if (foo) { if (foo) {
// get the obstacle // get the obstacle
const Ray3D::Obstacle3D obs = Ray3D::OBJPool::get().getObject(foo->file).rotated_deg(foo->rot).translated(foo->pos); const Ray3D::Obstacle3D obs = Ray3D::OBJPool::get().getObject(foo->file).scaled(foo->scale).rotated_deg(foo->rot).translated(foo->pos);
// construct its 2D convex hull (in centimter) // construct its 2D convex hull (in centimter)
HelperPoly poly; HelperPoly poly;
@@ -295,6 +300,8 @@ public:
void buildStairs(const Floorplan::IndoorMap* map, const Floorplan::Floor* floor, GridFactoryListener* listener = nullptr) { void buildStairs(const Floorplan::IndoorMap* map, const Floorplan::Floor* floor, GridFactoryListener* listener = nullptr) {
stairs.setAbortOnError(_abortOnError);
const int total = floor->stairs.size(); const int total = floor->stairs.size();
int cur = 0; int cur = 0;

View File

@@ -32,6 +32,7 @@ private:
std::vector<T*> toDelete; std::vector<T*> toDelete;
bool tryImproveStairConnections = true; bool tryImproveStairConnections = true;
bool abortOnError = true;
private: private:
@@ -47,7 +48,6 @@ private:
StairNode(const int x_cm, const int y_cm, const int quadIdx) : x_cm(x_cm), y_cm(y_cm), belongsToQuadIdx(quadIdx) {;} StairNode(const int x_cm, const int y_cm, const int quadIdx) : x_cm(x_cm), y_cm(y_cm), belongsToQuadIdx(quadIdx) {;}
}; };
@@ -62,7 +62,10 @@ public:
finalize(); finalize();
} }
/** whether to abort when errors are detected */
void setAbortOnError(const bool abort) {
this->abortOnError = abort;
}
@@ -184,7 +187,11 @@ public:
// be sure both are connected to a floor // be sure both are connected to a floor
if (!end1OK || !end2OK) { if (!end1OK || !end2OK) {
throw Exception("stair's start or end is not directly connectable to a floor"); if (abortOnError) {
throw Exception("stair's start or end is not directly connectable to a floor");
} else{
std::cout << "stair's start or end is not directly connectable to a floor" << std::endl;
}
} }
} }

View File

@@ -632,7 +632,7 @@ namespace NM {
Floorplan::Polygon2 res; Floorplan::Polygon2 res;
// fetch object from pool // fetch object from pool
const Ray3D::Obstacle3D obs = Ray3D::OBJPool::get().getObject(obj->file).rotated_deg(obj->rot).translated(obj->pos); const Ray3D::Obstacle3D obs = Ray3D::OBJPool::get().getObject(obj->file).scaled(obj->scale).rotated_deg(obj->rot).translated(obj->pos);
// construct 2D convex hull // construct 2D convex hull
res.points = ConvexHull2::get(obs.getPoints2D()); res.points = ConvexHull2::get(obs.getPoints2D());

View File

@@ -20,7 +20,7 @@ TEST(RayTrace3, test) {
ModelFactory fac(map); ModelFactory fac(map);
std::ofstream outOBJ("/tmp/vm/map.obj"); std::ofstream outOBJ("/tmp/vm/map.obj");
outOBJ << fac.getMesh().toOBJ(); outOBJ << fac.getMesh().toOBJ("obj").obj;
outOBJ.close(); outOBJ.close();
const int gs_cm = 50; const int gs_cm = 50;

View File

@@ -282,7 +282,7 @@ namespace Ray3D {
// attributes // attributes
const float r = foc->radius; const float r = foc->radius;
const float h = (foc->height > 0) ? (foc->height) : (fpos.height); const float h = (foc->height > 0) ? (foc->height) : (fpos.height); // use either floor's height or user height
const Point3 pos(foc->center.x, foc->center.y, fpos.z1 + h/2); const Point3 pos(foc->center.x, foc->center.y, fpos.z1 + h/2);
// build // build
@@ -310,7 +310,8 @@ namespace Ray3D {
const float deg = rad * 180 / M_PI; const float deg = rad * 180 / M_PI;
// cube's destination center // cube's destination center
const double height = (!aboveDoor) ? (fpos.height) : (fpos.height - aboveDoor->height); const float _height = (fol->height_m > 0) ? (fol->height_m) : (fpos.height); // use either floor's height or user height
const double height = (!aboveDoor) ? (_height) : (fpos.height - aboveDoor->height);
const double cenZ = (!aboveDoor) ? (fpos.z1 + height/2) : (fpos.z1 + aboveDoor->height + height/2);// (fpos.z2 - (fpos.height - aboveDoor->height) / 2); const double cenZ = (!aboveDoor) ? (fpos.z1 + height/2) : (fpos.z1 + aboveDoor->height + height/2);// (fpos.z2 - (fpos.height - aboveDoor->height) / 2);
const Point3 pos(cen2.x, cen2.y, cenZ); const Point3 pos(cen2.x, cen2.y, cenZ);
@@ -338,6 +339,7 @@ namespace Ray3D {
const std::string& name = foo->file; const std::string& name = foo->file;
Obstacle3D obs = OBJPool::get().getObject(name); Obstacle3D obs = OBJPool::get().getObject(name);
obs = obs.scaled(foo->scale);
obs = obs.rotated_deg( Point3(foo->rot.x, foo->rot.y, foo->rot.z) ); obs = obs.rotated_deg( Point3(foo->rot.x, foo->rot.y, foo->rot.z) );
obs = obs.translated(foo->pos + Point3(0,0,fpos.z1)); obs = obs.translated(foo->pos + Point3(0,0,fpos.z1));
obs.type = Obstacle3D::Type::OBJECT; obs.type = Obstacle3D::Type::OBJECT;

View File

@@ -38,6 +38,14 @@ namespace Ray3D {
/** ctor */ /** ctor */
Obstacle3D(Type type, Floorplan::Material mat) : type(type), mat(mat) {;} Obstacle3D(Type type, Floorplan::Material mat) : type(type), mat(mat) {;}
/** scaled copy */
Obstacle3D scaled(const Point3 scale) const {
Obstacle3D copy = *this;
for (Triangle3& tria : copy.triangles) {
tria *= scale;
}
return copy;
}
/** translated copy */ /** translated copy */
Obstacle3D translated(const Point3 pos) const { Obstacle3D translated(const Point3 pos) const {