簡體   English   中英

vtk 中多數據的自定義紋理

[英]custom texture for polydata in vtk

我想為演員設置自定義紋理,為多數據(簡單點)設置演員。 我試圖為演員(點)設置自己的紋理,但不知道出了什么問題

我不知道這個答案有什么問題

#include <vtkActor.h>
#include <vtkCellArray.h>
#include <vtkNamedColors.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkNew.h>
#include <vtkTexture.h>
#include <vtkDoubleArray.h>
#include <vtkImageData.h>
#include <vtkTexture.h>
#include <vtkPointData.h>
#include <vtkUnsignedCharArray.h>
#include <vtkProbeFilter.h>
#include <vtkGeometryFilter.h>

#include <array>

namespace {
    void setTexture(vtkActor* actor)
    {
        vtkNew<vtkImageData> image;

        // Create texture
        int dimension = 5 * 5;

        image->SetDimensions(5, 5, 1);
        image->AllocateScalars(VTK_UNSIGNED_CHAR, 25);
        image->SetExtent(0, 4, 0, 4, 0, 0);
        unsigned char* pixel;
        pixel = static_cast<unsigned char*>(image->GetScalarPointer());
        
        const std::array<int, 3> color{ 255, 0, 0 };
        const std::array<int, 25> mask{ 0, 0, 1, 0, 0,
                               0, 1, 1, 1, 0,
                               1, 1, 1, 1, 1,
                               0, 1, 1, 1, 0,
                               0, 0, 1, 0, 0 };

        for (int i = 0; i < mask.size(); i++)
        {
            if (mask[i] == 1)
            {
                std::copy(color.begin(), color.end(), pixel + 3 * i);
            }
        }

        vtkNew<vtkTexture> texture;

        texture->SetInputData(image);
        texture->InterpolateOff();

        actor->SetTexture(texture);
    }
}

int main(int, char* [])
{
    vtkNew<vtkNamedColors> colors;

    // Create the geometry of a point (the coordinate)
    vtkNew<vtkPoints> points;
    const float p[3] = { 0.0, 0.0, 0.0 };

    // Create the topology of the point (a vertex)
    vtkNew<vtkCellArray> vertices;
    // We need an an array of point id's for InsertNextCell.
    vtkIdType pid[1];
    pid[0] = points->InsertNextPoint(p);
    vertices->InsertNextCell(1, pid);

    // Create a polydata object
    vtkNew<vtkPolyData> point;

    // Set the points and vertices we created as the geometry and topology of the
    // polydata
    point->SetPoints(points);
    point->SetVerts(vertices);

    // Visualize
    vtkNew<vtkPolyDataMapper> mapper;
    mapper->SetInputData(point);

    vtkNew<vtkActor> actor;
    actor->SetMapper(mapper);
    vtkNew<vtkTexture> texture;
    actor->GetProperty()->SetColor(0, 0, 0);
    actor->GetProperty()->SetPointSize(5);
    setTexture(actor);

    vtkNew<vtkRenderer> renderer;
    vtkNew<vtkRenderWindow> renderWindow;
    renderWindow->SetWindowName("Point");
    renderWindow->AddRenderer(renderer);
    vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;
    renderWindowInteractor->SetRenderWindow(renderWindow);

    renderer->AddActor(actor);
    renderer->SetBackground(colors->GetColor3d("White").GetData());

    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM