スポンサーリンク

VTKでPointCloudを表示(改)

以前書いた奴と同じだが自分で読んでわかりにくかったので書き直し。

#include <iostream>

//VTK_MODULE_INITに必要
#include <vtkAutoInit.h>


#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>

#include <vtkDoubleArray.h>
#include <vtkPointData.h>
#include <vtkActor.h>

#include <vtkCellArray.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>


#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"psapi.lib")
#pragma comment(lib,"dbghelp.lib")
#pragma comment(lib,"ws2_32.lib")


//必須
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);

void create(
    
    vtkSmartPointer<vtkPoints> points, 
    vtkSmartPointer<vtkDoubleArray> colors, 
    vtkSmartPointer<vtkCellArray> cells

) {

    for (size_t i = 0; i < 100000; i++) {

        double x = (double)rand() / (double)RAND_MAX;
        double y = (double)rand() / (double)RAND_MAX;
        double z = (double)rand() / (double)RAND_MAX;

        points->InsertNextPoint(x, y, z);  // 座標追加
        colors->InsertNextTuple3(x, y, z); // 色情報追加

        cells->InsertNextCell(1);  // 要素数
        cells->InsertCellPoint(i); // 頂点インデックスを追加

    }
}

vtkSmartPointer<vtkActor> createActor() {

    // 頂点配列
    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();

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

    // 頂点インデクスの配列
    vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();

    create(points, colors, cells);

    ///////////////////////////////////////////////////

    // --- vtkPolyData作成 ---
    auto polydata = vtkSmartPointer<vtkPolyData>::New();
    polydata->SetPoints(points);
    polydata->SetVerts(cells);
    polydata->GetPointData()->SetScalars(colors);

    // --- actor作成 ---
    auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    mapper->SetInputData(polydata);

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

    return actor;

}
int main(int /*argc*/, char** /*argv*/)
{
    auto actor = createActor();

    auto renderer = vtkSmartPointer<vtkRenderer>::New();
    renderer->AddActor(actor);
    renderer->ResetCamera();

    //////////////////////////////////////
    auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();

    //////////////////////////////////////
    auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetInteractor(interactor);
    renderWindow->Render();

    interactor->Start(); //イベントループへ入る

    return 0;
}

コメントを残す

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

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


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