如何获得vtkboxwidget坐标

时间:2017-02-13 09:18:08

标签: vtk

我设置了一个3D数组图像数据,渲染并显示它,然后添加一个vtkboxwidget。

我想在用户旋转后获取vtkboxwidget的每个角度的坐标,缩放vtkboxwidget。我怎样才能做到这一点。这是我的代码。

#include "myrender.h"
#include <vtkInteractorStyleTrackballCamera.h>
// For vtkBoxWidget:
#include "vtkPlanes.h"
#include "vtkBoxWidget.h"
#include "vtkTransform.h"
#include "vtkCommand.h"
#include "vtkProperty.h"
#include "vtkPlane.h"
#include "vtkImageData.h"
#include "vtkExtractVOI.h"
#include "vtkBorderRepresentation.h"
#include "vtkProp3D.h"

class vtkMyCallback : public vtkCommand{
public:
    static vtkMyCallback *New()  {
        return new vtkMyCallback;
    }
    virtual void Execute(
         vtkObject *caller, unsigned long, void* )  {
    // Here we use the vtkBoxWidget to transform the underlying coneActor
    // (by manipulating its transformation matrix).
    vtkSmartPointer<vtkTransform> t =
        vtkSmartPointer<vtkTransform>::New();
    vtkBoxWidget *widget = reinterpret_cast<vtkBoxWidget*>(caller);
    widget->GetTransform( t );
    //widget->GetProp3D()->SetUserTransform( t );
    double *pos = t->GetPosition();
    t->GetMatrix();
    std::cout<<"position: "<<pos[0]<<" "<<pos[1]<<" "<<pos[2]<<std::endl;
}};
MyRender::MyRender() {
    ROIdata = NULL;
    ROI_sz0 = 0;
    ROI_sz1 = 0;
    ROI_sz2 = 0;
}

MyRender::~MyRender() {

}

void MyRender::setData(unsigned char *ROIdata, int ROI_sz0, int ROI_sz1,     int ROI_sz2) {
    this->ROIdata = ROIdata;
    this->ROI_sz0 = ROI_sz0;
    this->ROI_sz1 = ROI_sz1;
    this->ROI_sz2 = ROI_sz2;
}

void MyRender::render(vtkSmartPointer<vtkRenderWindow> renWin) {
int width = ROI_sz0;
int height = ROI_sz1;
int depth = ROI_sz2;
/**
 * RENDER WHOLE BRAIN DATA AND SHOW.
 */
//Convert the c-style image to a vtkImageData
vtkSmartPointer<vtkImageImport> imageImport = vtkSmartPointer<vtkImageImport>::New();
imageImport->SetImportVoidPointer(ROIdata);
imageImport->SetDataScalarTypeToUnsignedChar();
imageImport->SetNumberOfScalarComponents(1);
imageImport->SetDataSpacing(1.0, 1.0, 1.0);
imageImport->SetDataOrigin(0, 0, 0);
imageImport->SetDataExtent(0, width-1, 0, height-1, 0, depth-1);
imageImport->SetWholeExtent(0, width-1, 0, height-1, 0, depth-1);
imageImport->Update();
int *arr = imageImport->GetOutput()->GetDimensions();
std::cout<<"x size: "<<arr[0]<<" y size: "<<arr[1]<<" z size: "<<arr[2]<<std::endl;
//Create the standard ren, render window, and interactor
vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
//Create transfer mapping scalar value to opacity
vtkSmartPointer<vtkPiecewiseFunction> opacityFunc = vtkSmartPointer<vtkPiecewiseFunction>::New();
opacityFunc->AddPoint(0, 0.0);
opacityFunc->AddPoint(512, 1.0);
opacityFunc->ClampingOff();
//Create transfer mapping scalar value to color
vtkSmartPointer<vtkColorTransferFunction> colorFunc
        = vtkSmartPointer<vtkColorTransferFunction>::New();
colorFunc->AddRGBPoint(150, 1.0, 1.0, 1.0);
//The property describes how the data will look
vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->SetColor(colorFunc);
volumeProperty->SetScalarOpacity(opacityFunc);
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();
vtkSmartPointer<vtkSmartVolumeMapper> volumeMapper = vtkSmartPointer<vtkSmartVolumeMapper>::New();
volumeMapper->SetInputConnection(imageImport->GetOutputPort());
//The volume holds the mapper and the property and can be used to position/orient the volume
vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
ren->AddVolume(volume);
ren->SetBackground(0, 0, 0);

vtkSmartPointer<vtkBoxWidget> box = vtkSmartPointer<vtkBoxWidget>::New();
box->SetInteractor(renWin->GetInteractor());
box->SetPlaceFactor(1);
box->SetInputConnection(imageImport->GetOutputPort());
box->PlaceWidget();
box->InsideOutOn();
box->SetProp3D(volume);
box->GetOutlineProperty()->SetRepresentationToSurface();
box->GetOutlineProperty()->SetOpacity(1.0);
box->RotationEnabledOff();
vtkSmartPointer<vtkMyCallback> callback = vtkSmartPointer<vtkMyCallback>::New();
box->AddObserver(vtkCommand::InteractionEvent, callback);
box->On();

renWin->AddRenderer(ren);
renWin->Render();
}

如何在vtkCommand类中实时获取vtkboxwidget的coodinates。非常感谢。

1 个答案:

答案 0 :(得分:1)

来自doc

void vtkBoxWidget :: GetPolyData(vtkPolyData * pd)
抓取定义框小部件的polydata(包括点)。 polydata由6个四边形面和15个点组成。前八个点定义了八个角顶点;接下来的六个定义-x,+ x,-y,+ y,-z,+ z面部点;最后一点(15分中的第15分)定义了六面体的中心。当调用InteractionEvent或EndInteractionEvent事件时,这些点值保证是最新的。用户提供vtkPolyData,并将点和单元格添加到其中。

它看起来像是你在找什么?