点击打开链接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; }