Open3DのOBB。GetBoxPoints()のコメントに各頂点のindexが載っているのでそれを参考にすればLineSetで表示できる。
#include <Windows.h> #include <open3d/Open3D.h> #include <GL/GL.h> #pragma comment(lib, "opengl32.lib") std::shared_ptr<open3d::geometry::LineSet> obb_to_lineset(const open3d::geometry::OrientedBoundingBox& obb) { // BoundingVolume.h 参照 /// 0 ------------------- 1 /// /| /| /// / | / | /// / | / | /// / | / | /// 2 ------------------- 7 | /// | |____________|____| 6 /// | /3 | / /// | / | / /// | / | / /// |/ |/ /// 5 ------------------- 4 std::vector<Eigen::Vector3d> points = obb.GetBoxPoints(); std::vector<Eigen::Vector2i> linesegments; // 0-2-7-1 linesegments.push_back(Eigen::Vector2i(0,2)); linesegments.push_back(Eigen::Vector2i(2,7)); linesegments.push_back(Eigen::Vector2i(7,1)); linesegments.push_back(Eigen::Vector2i(1,0)); // 4-5-3-6 linesegments.push_back(Eigen::Vector2i(4,5)); linesegments.push_back(Eigen::Vector2i(5,3)); linesegments.push_back(Eigen::Vector2i(3,6)); linesegments.push_back(Eigen::Vector2i(6,4)); // 0-3-5-2 linesegments.push_back(Eigen::Vector2i(0,3)); linesegments.push_back(Eigen::Vector2i(3,5)); linesegments.push_back(Eigen::Vector2i(5,2)); linesegments.push_back(Eigen::Vector2i(2,0)); // 4-6-1-7 linesegments.push_back(Eigen::Vector2i(4,6)); linesegments.push_back(Eigen::Vector2i(6,1)); linesegments.push_back(Eigen::Vector2i(1,7)); linesegments.push_back(Eigen::Vector2i(7,4)); // 色を設定 std::vector<Eigen::Vector3d> colors; for (size_t i = 0; i < linesegments.size(); ++i) { colors.push_back(Eigen::Vector3d(0.0, 0.0, 0.0)); } auto line_set = std::make_shared<open3d::geometry::LineSet>(); line_set->points_ = points; line_set->lines_ = linesegments; line_set->colors_ = colors; return line_set; } int main() { // 点群データの作成 auto cloud = std::make_shared<open3d::geometry::PointCloud>(); // ランダムな点を生成 for (int i = 0; i < 50000; ++i) { double x = (static_cast<double>(rand()) / RAND_MAX) * 80.0; double y = (static_cast<double>(rand()) / RAND_MAX) * 30.0; double z = (static_cast<double>(rand()) / RAND_MAX) * 10.0; cloud->points_.push_back(Eigen::Vector3d(x, y, z)); } auto lineset = obb_to_lineset(cloud->GetOrientedBoundingBox()); // 表示用のウィンドウを作成 open3d::visualization::Visualizer visualizer; visualizer.CreateVisualizerWindow("Open3D Visualization", 800, 600); visualizer.AddGeometry(cloud); visualizer.AddGeometry(lineset); visualizer.UpdateGeometry(); visualizer.PollEvents(); visualizer.UpdateRender(); // ウィンドウを閉じるまでループ while (visualizer.PollEvents()) { visualizer.UpdateRender(); } visualizer.DestroyVisualizerWindow(); return 0; }