我在创建imagedata并进行体绘制时,遇到奇怪的问题:
每次运行完后,提示“
excited with code 255”,然后不出现图像窗口
float *ptr
=(
float
*)
imageData
->
GetScalarPointer
();
//ptr=(float *)imageData->GetScalarPointer();
for(int i=0;i<nx*ny*nz;i++)
{
fscanf(fp,"%f",&velocity);
//fscanf(fp,"%f",&lat);
//printf("%e\n",flux);
//velocity=velocity*1.0;
cout<<velocity<<endl;
//*ptr++=i;
*ptr++=(float)(velocity);
cout<<*ptr++<<endl;
//fscanf(fp,"%*[^\n]%*c"); /* 跳过一行字符串 */
}
后来我发现问题是没有搞明白imagedata在使用volumeRayCast算法时应该是针对unsigned char 和unsigned short类型的数据,将数据类型改过来,不再有错误提示
unsigned short *ptr
=(
unsigned
short
*)
imageData
->
GetScalarPointer
();
//ptr=(float *)imageData->GetScalarPointer();
for(int i=0;i<nx*ny*nz;i++)
{
fscanf(fp,"%f",&velocity);
//fscanf(fp,"%f",&lat);
//printf("%e\n",flux);
//velocity=velocity*1.0;
cout<<velocity<<endl;
//*ptr++=i;
*ptr++=(unsigned short)(velocity);
cout<<*ptr++<<endl;
//fscanf(fp,"%*[^\n]%*c"); /* 跳过一行字符串 */
}
因为vtkImageData 对象的自变量的 SetInput()方法。某 些 绘 制 技 术 只 支 持 特 定 类 型 的 输 入 数 据 。 例 如 , vtkVolumeRayCastMapper 和 vtkVolumeTextureMapper2D 都 只 支 持 VTK_UNSIGNED_CHAR 和 VTK_UNSIGNED_SHORT 数据。vtkVolumeProMapper 更为限制性的因为它只支持 8 或者 12 位数据, 12 位数据表示为 VTK_UNSIGNED_SHORT 数据,最重要的位在 16 位之外的高 12 位或者低 12 位。(如果你的数据不是上面期望的类型,你可以使用 vtkImageShiftScale 来把数据的比例调整为正确的范围并且把它转化为正确的类型)
例如:
double newrange=65535.0;///因为unsigned short范围0-65535,double oldrange=0.0;oldrange=imageData->GetScalarRange()[1]-imageData->GetScalarRange()[0];vtkSmartPointer<vtkImageShiftScale> shiftScaleFilter =vtkSmartPointer<vtkImageShiftScale>::New();shiftScaleFilter->SetOutputScalarTypeToUnsignedShort();#if VTK_MAJOR_VERSION <= 5shiftScaleFilter->SetInputConnection(imageData->GetProducerPort());#elseshiftScaleFilter->SetInputData(imageData);#endifshiftScaleFilter->SetShift((-1.0f*imageData->GetScalarRange()[0]));/先将数据平移到0,移动大小为GetScalarRange()[0]shiftScaleFilter->SetScale(newrange/oldrange);shiftScaleFilter->Update();
以上代码就将数据范围重新映射到0-65535,tongs2转换为unsigedshort类型。下次就可以将shiftscalefilter的输出作为体绘制数据输入
具体可以参考:http://blog.csdn.net/www_doling_net/article/details/8547317