スポンサーリンク

Open3DのOBBをLineSetで表示

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;
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: