スポンサーリンク

VTK from Open3D (LineSet)

#pragma once

#include <vtkCellArray.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkDoubleArray.h>
#include <vtkSmartPointer.h>
#include <vtkPointData.h>
#include <vtkProperty.h>
#include <vtkLine.h>

#include "vtkFromO3dCommon.hpp"

#include <open3d/Open3D.h>

namespace vtko3d {
    vtkSmartPointer<vtkPolyData> toLineSetPolyData(const open3d::geometry::LineSet& linesegments, USEVALUE usedata) {

        // 頂点の作成
        vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
        // 色情報の配列
        vtkSmartPointer<vtkDoubleArray> colors = vtkSmartPointer<vtkDoubleArray>::New();
        colors->SetNumberOfComponents(3);
        colors->SetName("Colors");

        for (size_t i = 0; i < linesegments.points_.size(); i++) {

            double x = linesegments.points_[i].x();
            double y = linesegments.points_[i].y();
            double z = linesegments.points_[i].z();
            points->InsertNextPoint(x, y, z);

            if (usedata & POINT_RGB) {
                double r = linesegments.colors_[i].x();
                double g = linesegments.colors_[i].y();
                double b = linesegments.colors_[i].z();
                colors->InsertNextTuple3(r, g, b); // 色情報追加
            }

        }

        // 線分(Cell)を定義
        vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();

        for (size_t i = 0; i < linesegments.lines_.size(); i++) {

            size_t v1 = linesegments.lines_[i].x();
            size_t v2 = linesegments.lines_[i].y();
            // 線分を作成
            auto line = vtkSmartPointer<vtkLine>::New();
            line->GetPointIds()->SetId(0, v1); // 始点
            line->GetPointIds()->SetId(1, v2); // 終点
            lines->InsertNextCell(line);
        }

        // PolyDataへ格納
        vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
        polyData->SetPoints(points);
        polyData->SetLines(lines);
        polyData->GetPointData()->SetScalars(colors);

        return polyData;
    }

    vtkSmartPointer<vtkActor> toLineSegmentsActor(vtkSmartPointer<vtkPolyDataMapper> mapper, std::optional< std::array<double, 3> > single_color = std::nullopt, int line_width = 1) {


        vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
        actor->SetMapper(mapper);

        if (single_color.has_value()) {
            actor->GetProperty()->SetColor(single_color.value()[0], single_color.value()[1], single_color.value()[2]);
        }
        else {
            actor->GetProperty()->SetColor(1.0, 1.0, 1.0); // デフォルトは白色
        }
        if (line_width > 0) {
            actor->GetProperty()->SetLineWidth(line_width);  // 線の太さ
        }
        return actor;
    }

    std::shared_ptr<open3d::geometry::LineSet> createSampleLineSegments() {
        auto linesets = std::make_shared<open3d::geometry::LineSet>();

        for (size_t i = 0; i < 1000; i++) {
            for (size_t j = 0; j < 100; j++) {
                double x1 = (double)rand() / (double)RAND_MAX;
                double y1 = (double)rand() / (double)RAND_MAX;
                double z1 = 0.0;// (double)rand() / (double)RAND_MAX;
                double x2 = x1;
                double y2 = y1;
                double z2 = 1.0;// (double)rand() / (double)RAND_MAX;
                linesets->points_.emplace_back(x1, y1, z1);
                linesets->points_.emplace_back(x2, y2, z2);
                linesets->colors_.emplace_back(x1, y1, z1); // 赤色のライン
                linesets->colors_.emplace_back(x2, y2, z2); // 青色のライン
                linesets->lines_.emplace_back(i * 2, i * 2 + 1); // ラインセグメントのインデックス
            }
        }
        return linesets;
    }
}

使用例

    auto linesegments = vtko3d::createSampleLineSegments();
    auto polyData = vtko3d::toLineSetPolyData(*linesegments, vtko3d::POINT_RGB);
    auto mapper = vtko3d::toMapper(polyData);
    auto actor = vtko3d::toLineSegmentsActor(mapper, std::nullopt, 2);

コメントを残す

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

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


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