关闭

VTK里面imgedata体绘制遇到的问题

标签: vtkimagedata 体绘制
312人阅读 评论(0) 收藏 举报
分类:
我在创建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=(unsignedshort*)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 <= 5
        shiftScaleFilter->SetInputConnection(imageData->GetProducerPort());
      #else
        shiftScaleFilter->SetInputData(imageData);
      #endif
        shiftScaleFilter->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
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:16328次
    • 积分:286
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:26篇
    • 译文:0篇
    • 评论:0条