为什么我的 VTK 什么都不显示?
Why my VTK display nothing?
我用了几年VTK,今天发现一个问题很奇怪,代码如下:
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include "vtkBoxWidget.h"
#include "vtkCamera.h"
#include "vtkCommand.h"
#include "vtkColorTransferFunction.h"
#include "vtkPiecewiseFunction.h"
#include "vtkPlanes.h"
#include "vtkProperty.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkVolume.h"
#include "vtkVolumeProperty.h"
#include "vtkFixedPointVolumeRayCastMapper.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
#include <limits>
#include <string>
int main(int argc, char *argv[])
{
/************************************************************************/
/* Generate a RGBA volume */
/************************************************************************/
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
int dim[3] = { 10, 10, 10 };
double spacing[3] = { 1.0, 1.0, 1.0 };
double origin[3] = { 0.0, 0.0, 0.0 };
image->SetDimensions(dim);
image->SetSpacing(spacing);
image->SetOrigin(origin);
image->AllocateScalars(VTK_UNSIGNED_CHAR, 4);
unsigned char* ptr = static_cast<unsigned char*>(image->GetScalarPointer());
int idx = 0;
for (int z = 0; z < 10; z++){
for (int y = 0; y < 10; y++){
for (int x = 0; x < 10; x++){
if (z > 6){
ptr[idx] = 255;
ptr[idx + 1] = 0;
ptr[idx + 2] = 0;
ptr[idx + 3] = 255;
}
else{
ptr[idx] = 0;
ptr[idx + 1] = 0;
ptr[idx + 2] = 0;
ptr[idx + 3] = 0;
}
idx += 4;
}
}
}
/************************************************************************/
/* Rendering */
/************************************************************************/
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
iren->SetDesiredUpdateRate(10.0);
iren->GetInteractorStyle()->SetDefaultRenderer(renderer);
// Create our volume and mapper
vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> mapper = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
mapper->SetInputData(image);
mapper->SetBlendModeToComposite();
mapper->SetSampleDistance(0.1);
vtkSmartPointer<vtkPiecewiseFunction> opacityFun = vtkSmartPointer<vtkPiecewiseFunction>::New();
opacityFun->AddPoint(0, 0.0);
opacityFun->AddPoint(255, 1.0);
// Create the property and attach the transfer functions
vtkSmartPointer<vtkVolumeProperty> property = vtkSmartPointer<vtkVolumeProperty>::New();
property->SetScalarOpacity(opacityFun);
property->IndependentComponentsOff();
//property->SetInterpolationTypeToLinear();
// connect up the volume to the property and the mapper
volume->SetProperty(property);
volume->SetMapper(mapper);
// Set the default window size
renWin->SetSize(400, 400);
renWin->Render();
// Add the volume to the scene
renderer->AddVolume(volume);
renderer->ResetCamera();
// interact with data
renWin->Render();
iren->Start();
return 1;
}
我正在生成一个 10*10*10 的 RGBA 体积并显示它,但我的屏幕上什么也没有。在第 46 行,如果我将 (z > 6) 更改为 (z < 2),它会按我的预期显示正确的框,如果我将 (z > 6) 更改为 (z > 6 || z < 2),它也会显示 2 个正确的框。
那为什么(z > 6)什么都不显示?我应该怎么做才能使其 运行 正确?
这对我来说像是一个错误。如果为 z<=6 将不透明度设置为 1 而不是 0,则可以解决您的问题,这似乎只在不透明度等于 0 时才会发生。
我用了几年VTK,今天发现一个问题很奇怪,代码如下:
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include "vtkBoxWidget.h"
#include "vtkCamera.h"
#include "vtkCommand.h"
#include "vtkColorTransferFunction.h"
#include "vtkPiecewiseFunction.h"
#include "vtkPlanes.h"
#include "vtkProperty.h"
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkVolume.h"
#include "vtkVolumeProperty.h"
#include "vtkFixedPointVolumeRayCastMapper.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle)
#include <limits>
#include <string>
int main(int argc, char *argv[])
{
/************************************************************************/
/* Generate a RGBA volume */
/************************************************************************/
vtkSmartPointer<vtkImageData> image = vtkSmartPointer<vtkImageData>::New();
int dim[3] = { 10, 10, 10 };
double spacing[3] = { 1.0, 1.0, 1.0 };
double origin[3] = { 0.0, 0.0, 0.0 };
image->SetDimensions(dim);
image->SetSpacing(spacing);
image->SetOrigin(origin);
image->AllocateScalars(VTK_UNSIGNED_CHAR, 4);
unsigned char* ptr = static_cast<unsigned char*>(image->GetScalarPointer());
int idx = 0;
for (int z = 0; z < 10; z++){
for (int y = 0; y < 10; y++){
for (int x = 0; x < 10; x++){
if (z > 6){
ptr[idx] = 255;
ptr[idx + 1] = 0;
ptr[idx + 2] = 0;
ptr[idx + 3] = 255;
}
else{
ptr[idx] = 0;
ptr[idx + 1] = 0;
ptr[idx + 2] = 0;
ptr[idx + 3] = 0;
}
idx += 4;
}
}
}
/************************************************************************/
/* Rendering */
/************************************************************************/
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
iren->SetDesiredUpdateRate(10.0);
iren->GetInteractorStyle()->SetDefaultRenderer(renderer);
// Create our volume and mapper
vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> mapper = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
mapper->SetInputData(image);
mapper->SetBlendModeToComposite();
mapper->SetSampleDistance(0.1);
vtkSmartPointer<vtkPiecewiseFunction> opacityFun = vtkSmartPointer<vtkPiecewiseFunction>::New();
opacityFun->AddPoint(0, 0.0);
opacityFun->AddPoint(255, 1.0);
// Create the property and attach the transfer functions
vtkSmartPointer<vtkVolumeProperty> property = vtkSmartPointer<vtkVolumeProperty>::New();
property->SetScalarOpacity(opacityFun);
property->IndependentComponentsOff();
//property->SetInterpolationTypeToLinear();
// connect up the volume to the property and the mapper
volume->SetProperty(property);
volume->SetMapper(mapper);
// Set the default window size
renWin->SetSize(400, 400);
renWin->Render();
// Add the volume to the scene
renderer->AddVolume(volume);
renderer->ResetCamera();
// interact with data
renWin->Render();
iren->Start();
return 1;
}
我正在生成一个 10*10*10 的 RGBA 体积并显示它,但我的屏幕上什么也没有。在第 46 行,如果我将 (z > 6) 更改为 (z < 2),它会按我的预期显示正确的框,如果我将 (z > 6) 更改为 (z > 6 || z < 2),它也会显示 2 个正确的框。
那为什么(z > 6)什么都不显示?我应该怎么做才能使其 运行 正确?
这对我来说像是一个错误。如果为 z<=6 将不透明度设置为 1 而不是 0,则可以解决您的问题,这似乎只在不透明度等于 0 时才会发生。