2017-02-13 9 views
0

3D 배열 이미지 데이터를 설정하고 렌더링 한 다음 vtkboxwidget을 추가합니다.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의의 좌표를 얻을 수 있습니다. 고마워. doc에서

답변

1

:

무효 vtkBoxWidget :: GetPolyData (vtkPolyData *의 PD)
잡고 polydata (지점 포함) 상자 위젯을 정의합니다. polydata는 6 개의 사변형면과 15 개의 점으로 구성됩니다. 처음 8 개의 점은 8 개의 꼭지점을 정의합니다. 다음 6 개는 -x, + x, -y, + y, -z, + z 얼굴 점을 정의합니다. 마지막 점 (15 점 중 15 위)은 육면체의 중심을 정의합니다. 이 점수 값은 InteractionEvent 또는 EndInteractionEvent 이벤트가 호출 될 때 최신 상태로 유지됩니다. 사용자가 vtkPolyData를 제공하면 점과 셀이 추가됩니다.

찾고있는 것과 같거나 그렇지 않은 것 같습니다.

+0

대단히 고맙습니다. 그게 내가 원하는 것입니다. 입력 연결을 처음에 설정하고 getpolydata를 사용하여 범위를 가져옵니다. 고맙습니다. box-> SetInputConnection (imageImport-> GetOutputPort()); vtkSmartPointer pd = vtkSmartPointer :: 신규(); 상자 -> GetPolyData (pd); double * bound = pd-> GetBounds(); – MySuperPower

+0

기꺼이 도와 드리겠습니다. 이렇게하면 필요한 모든 것을 해결할 수 있습니다. 답변을 수락 한 것으로 표시 할 수 있습니까? 답변이없는 질문 목록에서 사라 지도록 ... – tomj

+0

고마워요, 회색 고리를 클릭하고 녹색으로 바뀌 었습니다. 나는 아주 미안해 나는 영어가 능숙하지 못해. – MySuperPower