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에서
대단히 고맙습니다. 그게 내가 원하는 것입니다. 입력 연결을 처음에 설정하고 getpolydata를 사용하여 범위를 가져옵니다. 고맙습니다. box-> SetInputConnection (imageImport-> GetOutputPort()); vtkSmartPointer pd = vtkSmartPointer :: 신규(); 상자 -> GetPolyData (pd); double * bound = pd-> GetBounds(); –
MySuperPower
기꺼이 도와 드리겠습니다. 이렇게하면 필요한 모든 것을 해결할 수 있습니다. 답변을 수락 한 것으로 표시 할 수 있습니까? 답변이없는 질문 목록에서 사라 지도록 ... – tomj
고마워요, 회색 고리를 클릭하고 녹색으로 바뀌 었습니다. 나는 아주 미안해 나는 영어가 능숙하지 못해. – MySuperPower