c++ - 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;
}
推荐阅读
- java - 如何防止 ImageView 以编程方式调整大小以适应屏幕?
- python - 为什么我的 if elif 循环无法始终如一地在数据中找到字符串
- php - PHP 复选框循环数组
- javascript - Truffle Pet Shop 理解 App.js 代码
- amazon-rds - AWS RDS 可用内存何时回收?
- c++ - 带颜色的双边过滤器
- html - 图像上的半透明颜色层?
- javascript - 如何在 PHP 文件中正确使用 React.js CDN?
- java - 运行 javafx 11 程序时出现 InvocationTargetException
- javascript - 向语音合成 API 添加暂停和播放功能