スポンサーリンク
#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);