vtk平移旋转缩放变换:TransformOrderDemo

点击打开链接https://lorensen.github.io/VTKExamples/site/Cxx/PolyData/TransformOrderDemo/

TransformOrderDemo

VTKExamples/Cxx/PolyData/TransformOrderDemo

<a href="https://github.com/lorensen/VTKExamples/blob/master/src/Testing/Baseline/Cxx/PolyData/TestTransformOrderDemo.png?raw=true%20target=" _blank"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: rgb(63, 81, 181); word-break: break-word; transition: color 0.125s;">


Description

This example creates an image. In the left viewport, it translates the image, then translates and rotates the image. In the right viewport, it rotates the image, then rotates and translates the image. One can see that the result is clearly not the same!

Code

TransformOrderDemo.cxx

#include <vtkSmartPointer.h>
#include <vtkTransform.h>
#include <vtkAxesActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkImageMandelbrotSource.h>
#include <vtkImageActor.h>
#include <vtkImageMapper3D.h>
#include <vtkImageCast.h>

int main(int, char *[])
{
  // Create an image
  vtkSmartPointer<vtkImageMandelbrotSource> source =
    vtkSmartPointer<vtkImageMandelbrotSource>::New();
  source->Update();

  vtkSmartPointer<vtkImageCast> castFilter =
    vtkSmartPointer<vtkImageCast>::New();
  castFilter->SetInputConnection(source->GetOutputPort());
  castFilter->SetOutputScalarTypeToUnsignedChar();
  castFilter->Update();

  // Create an actor
  vtkSmartPointer<vtkImageActor> actor1a =
    vtkSmartPointer<vtkImageActor>::New();
  actor1a->GetMapper()->SetInputConnection(castFilter->GetOutputPort());
  vtkSmartPointer<vtkImageActor> actor1b =
    vtkSmartPointer<vtkImageActor>::New();
  actor1b->GetMapper()->SetInputConnection(castFilter->GetOutputPort());

  vtkSmartPointer<vtkImageActor> actor2a =
    vtkSmartPointer<vtkImageActor>::New();
  actor2a->GetMapper()->SetInputConnection(castFilter->GetOutputPort());

  vtkSmartPointer<vtkImageActor> actor2b =
    vtkSmartPointer<vtkImageActor>::New();
  actor2b->GetMapper()->SetInputConnection(castFilter->GetOutputPort());

  // Create the transformation
  vtkSmartPointer<vtkTransform> transform1a =
    vtkSmartPointer<vtkTransform>::New();
  transform1a->PostMultiply();
  transform1a->Translate(10.0, 0.0, 0.0);
  actor1a->SetUserTransform(transform1a);

  vtkSmartPointer<vtkTransform> transform1b =
    vtkSmartPointer<vtkTransform>::New();
  transform1b->PostMultiply();
  transform1b->Translate(10.0, 0.0, 0.0);
  transform1b->RotateZ(40.0);
  actor1b->SetUserTransform(transform1b);

  vtkSmartPointer<vtkTransform> transform2a =
    vtkSmartPointer<vtkTransform>::New();
  transform2a->PostMultiply();
  transform2a->RotateZ(40.0);
  actor2a->SetUserTransform(transform2a);

  vtkSmartPointer<vtkTransform> transform2b =
    vtkSmartPointer<vtkTransform>::New();
  transform2b->PostMultiply();
  transform2b->RotateZ(40.0);
  transform2b->Translate(10.0, 0.0, 0.0);
  actor2b->SetUserTransform(transform2b);

  // Define viewport ranges
  // (xmin, ymin, xmax, ymax)
  double leftViewport[4] = {0.0, 0.0, 0.5, 1.0};
  double rightViewport[4] = {0.5, 0.0, 1.0, 1.0};

  // Cetup render window
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();

  // Setup both renderers
  vtkSmartPointer<vtkRenderer> leftRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderWindow->AddRenderer(leftRenderer);
  leftRenderer->SetViewport(leftViewport);
  leftRenderer->SetBackground(.6, .5, .4);

  vtkSmartPointer<vtkRenderer> rightRenderer =
    vtkSmartPointer<vtkRenderer>::New();
  renderWindow->AddRenderer(rightRenderer);
  rightRenderer->SetViewport(rightViewport);
  rightRenderer->SetBackground(.4, .5, .6);  

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

  interactor->SetRenderWindow(renderWindow);

  vtkSmartPointer<vtkAxesActor> axes =
    vtkSmartPointer<vtkAxesActor>::New();
  axes->AxisLabelsOff();
  axes->SetTotalLength(5,5,5);

  leftRenderer->AddActor(axes);
  leftRenderer->AddActor(actor1a);
  leftRenderer->AddActor(actor1b);

  rightRenderer->AddActor(axes);
  rightRenderer->AddActor(actor2a);
  rightRenderer->AddActor(actor2b);

  leftRenderer->ResetCamera();
  rightRenderer->ResetCamera();

  renderWindow->Render();

  interactor->Start();

  return EXIT_SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在VTK中染色显示PCL中的点云,可以将PCL中的点云转换为VTK中的点云,并创建一个颜色映射器(color mapper)来将点云中的颜色映射到颜色映射器中的颜色,最后将映射器附加到Actor上,将Actor添加到Renderer中,并将Renderer添加到RenderWindow中,最后显示RenderWindow。 下面是一个示例代码,可以将PCL中的PointXYZRGB点云转换为VTK中的点云,并用颜色映射器将点云中的颜色映射到颜色映射器中的颜色,最后显示出来。 ```C++ #include <iostream> #include <pcl/point_cloud.h> #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> #include <vtkSmartPointer.h> #include <vtkPoints.h> #include <vtkPolyData.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkUnsignedCharArray.h> #include <vtkColorTransferFunction.h> using namespace std; int main(int argc, char** argv) { // 读取PCL点云 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); pcl::io::loadPCDFile<pcl::PointXYZRGB>("sample.pcd", *cloud); // 创建VTK点云和颜色映射器 vtkSmartPointer<vtkPoints> vtkPoints = vtkSmartPointer<vtkPoints>::New(); vtkSmartPointer<vtkUnsignedCharArray> vtkColors = vtkSmartPointer<vtkUnsignedCharArray>::New(); vtkSmartPointer<vtkColorTransferFunction> colorTransferFunction = vtkSmartPointer<vtkColorTransferFunction>::New(); // 将PCL中的点云转换为VTK中的点云,并将点云中的颜色映射到颜色映射器中的颜色 for (pcl::PointCloud<pcl::PointXYZRGB>::iterator it = cloud->begin(); it != cloud->end(); it++) { vtkPoints->InsertNextPoint(it->x, it->y, it->z); vtkColors->InsertNextTuple3(it->r, it->g, it->b); colorTransferFunction->AddRGBPoint(it->r, it->g, it->b); } // 创建映射器 vtkSmartPointer<vtkPolyData> vtkPolyData = vtkSmartPointer<vtkPolyData>::New(); vtkPolyData->SetPoints(vtkPoints); vtkPolyData->GetPointData()->SetScalars(vtkColors); vtkSmartPointer<vtkPolyDataMapper> vtkPolyDataMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); vtkPolyDataMapper->SetInputData(vtkPolyData); vtkPolyDataMapper->SetLookupTable(colorTransferFunction); vtkPolyDataMapper->SetScalarRange(0, 255); // 创建Actor并将映射器附加到Actor上 vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(vtkPolyDataMapper); // 将Actor添加到Renderer中,并将Renderer添加到RenderWindow中 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); // 显示RenderWindow vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetRenderWindow(renderWindow); renderWindowInteractor->Initialize(); renderWindowInteractor->Start(); return 0; } ``` 在这个示例代码中,我们创建了一个PCL的PointXYZRGB点云,并将其从文件中读取到内存中。然后,我们创建了一个VTK的点云和颜色映射器,并将PCL中的点云转换为VTK中的点云,并将点云中的颜色映射到颜色映射器中的颜色。接着,我们创建了一个映射器,并将其附加到Actor上,将Actor添加到Renderer中,并将Renderer添加到RenderWindow中,最后显示RenderWindow。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值