Hello,
I am trying to modify the TestGLUTRenderWindow example in order to render voume data using glut. I’m not getting anything on screen. I wonder if someone could check the code and see what I might be missing. Thanks!
This is my display function:
void display()
{
if (!initialized)
{
myCamera = new Camera(glm::vec3(0, 0, -4), glm::vec3(0, 0, 1));
projectionMatrix = glm::perspective(glm::radians(45.f), 4.0f / 3.0f, 0.1f, 100.0f );
auto renWin = externalVTKWidget->GetRenderWindow();
// since our example here is not setting up the `glViewport`, we don't want
// the vtkExternalOpenGLRenderWindow to update its size based on the
// glViewport hence we must disable automatic position and size.
renWin->AutomaticWindowPositionAndResizeOff();
vtkNew<vtkCallbackCommand> callback;
callback->SetCallback(MakeCurrentCallback);
renWin->AddObserver(vtkCommand::WindowMakeCurrentEvent,
callback);
vtkNew<vtkPolyDataMapper> mapper;
myRenderer = externalVTKWidget->AddRenderer();
std::string filePath =std::string("D:\\VTK\\Rendering\\External\\Testing\\Cxx\\data\\FullHead.mhd");
vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper =
vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
vtkSmartPointer<vtkMetaImageReader> metaReader =
vtkSmartPointer<vtkMetaImageReader>::New();
metaReader->SetFileName(filePath.c_str());
metaReader->Update();
vtkSmartPointer<vtkAlgorithm> reader =
vtkSmartPointer<vtkAlgorithm>::New();
vtkSmartPointer<vtkImageData> input =
vtkSmartPointer<vtkImageData>::New();
input = metaReader->GetOutput();
reader = metaReader;
vtkSmartPointer<vtkTransform> transform =
vtkSmartPointer<vtkTransform>::New();
transform->Scale(1,1, 1);
volumeMapper->SetInputConnection(reader->GetOutputPort());
vtkSmartPointer<vtkVolumeProperty> volumeProperty =
vtkSmartPointer<vtkVolumeProperty>::New();
//volumeProperty->ShadeOff();
volumeProperty->SetInterpolationTypeToLinear();
volumeProperty->SetIndependentComponents(true);
vtkSmartPointer<vtkPiecewiseFunction> opacityFun =
vtkSmartPointer<vtkPiecewiseFunction>::New();
volumeProperty->SetScalarOpacity(opacityFun); // composite first.
vtkSmartPointer<vtkColorTransferFunction> colorFun =
vtkSmartPointer<vtkColorTransferFunction>::New();
volumeProperty->SetColor(colorFun);
volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
volume->SetUserTransform(transform);
colorFun->AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0);
opacityFun->AddSegment(opacityLevel - 0.5*opacityWindow, 0.0,
opacityLevel + 0.5*opacityWindow, 1.0);
volumeMapper->SetBlendModeToMaximumIntensity();
myRenderer->AddVolume(volume);
myRenderer->ResetCamera();
initialized = true;
}
// Enable depth testing. Demonstrates OpenGL context being managed by external
// application i.e. GLUT in this case.
glEnable(GL_DEPTH_TEST);
// Buffers being managed by external application i.e. GLUT in this case.
glClearColor(1.0f, 0.0f, 0.0f, 1.0f); // Set background color to black and opaque
glClearDepth(1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear the color buffer
vtkExternalOpenGLCamera* camera = (vtkExternalOpenGLCamera *)myRenderer->GetActiveCamera();
double view[16];
for (int i = 0; i < 16; i++) {
//view[i] = glm::value_ptr(viewMatrix)[i];
glm::mat4 mat = myCamera->GetView();
view[i] = glm::value_ptr(mat)[i];
}
camera->SetViewTransformMatrix(view);
double proj[16];
for (int i = 0; i < 16; i++) {
proj[i] = glm::value_ptr(projectionMatrix)[i];
}
camera->SetProjectionTransformMatrix(proj);
glFlush(); // Render now
vtkLogScopeF(INFO, "do-vtk-render");
externalVTKWidget->GetRenderWindow()->Render();
glutSwapBuffers();
}
void test()
{
vtkExternalOpenGLCamera* camera = (vtkExternalOpenGLCamera *)myRenderer->GetActiveCamera();
double view[16];
for (int i = 0; i < 16; i++) {
//view[i] = glm::value_ptr(viewMatrix)[i];
glm::mat4 mat = myCamera->GetView();
view[i] = glm::value_ptr(mat)[i];
}
camera->SetViewTransformMatrix(view);
glm::mat4 userM = glm::mat4(1.0f);
glm::mat4 translate = glm::translate(glm::vec3(0, 0, 0));
glm::mat4 rotate = glm::translate(glm::vec3(0, 0, 0));
glm::mat4 scale = glm::translate(glm::vec3(1, 1, 1));
userM = translate * rotate * scale;
double model[16];
for (int i = 0; i < 16; i++) {
//view[i] = glm::value_ptr(viewMatrix)[i];
model[i] = glm::value_ptr(userM)[i];
}
vtkSmartPointer<vtkMatrix4x4> sm = vtkSmartPointer<vtkMatrix4x4>::New();
sm->DeepCopy(model);
sm->Transpose();
volume->SetUserMatrix(sm);
double proj[16];
for (int i = 0; i < 16; i++) {
proj[i] = glm::value_ptr(projectionMatrix)[i];
}
externalVTKWidget->GetRenderWindow()->Render();
camera->SetProjectionTransformMatrix(proj);
}