如何获取vtkboxwidget坐标

How to get vtkboxwidget coordinates

我设置了一个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 class 中实时获取 vtkboxwidget 的坐标。非常感谢。

来自doc

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

看起来是不是您要找的?