0

点群を操作するための簡単なツールを作成しています。マウスの移動で多角形の選択ができるようにしたい。Ubuntu 12.04 で VTK 5.10 と QVTKWidget を使用しています。

これを行うために、テスト ファイルを変更して polygonalSelector クラスを作成しましたここで説明されているように、vtk 6 の代わりに VTK 5.10 を使用する必要がありました: (古いバージョンを使用する必要があることに注意してください) http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Replacement_of_SetInput

コードでは、多角形が描かれ、次に vtkHardwareSelector オブジェクトvtkNew<vtkHardwareSelector> hardSel;が GeneratePolygonSelection のメソッドに使用されます。

私が直面している問題は、次の条件がテストされるときです。

if (hardSel->CaptureBuffers())

内部的には、CaptureBuffers() にはこれを行うコードが含まれています。

  vtkRenderWindow *rwin = this->Renderer->GetRenderWindow();
  int rgba[4];
  rwin->GetColorBufferSizes(rgba);
  if (rgba[0] < 8 || rgba[1] < 8 || rgba[2] < 8)
  {
    vtkErrorMacro("Color buffer depth must be atleast 8 bit. "
      "Currently: " << rgba[0] << ", " << rgba[1] << ", " <<rgba[2]);
    return false;
  }

常にfalseを返すため、この時点を過ぎることはありません。ColorBufferSizes を設定する方法がわからず、この点を明確にするための情報をオンラインで見つけることができませんでした。これはエラー出力です:

  vtkHardwareSelector (0x168dcd0): Color buffer depth must be atleast 8 bit. Currently: 17727456, 0, 23649488

デバッグでは、rgba int は変更されません (呼び出しの前後で同じままrwin->GetColorBufferSizes(rgba)です)。

vtkRenderWindow のドキュメントには、次のように記載されています。

virtual int vtkRenderWindow::GetColorBufferSizes    (   int *   rgba    )
Get the size of the color buffer. Returns 0 if not able to determine otherwise sets R G B and A into buffer.

Implemented in vtkOpenGLRenderWindow, and vtkOpenGLRenderWindow.

vtkOpenGLRenderWindow を使用する必要がありますか? そのクラス リファレンスでは、「アプリケーション プログラマーは通常、OpenGL 固有のバージョンではなく vtkRenderWindow を使用する必要があります」と記載されています。

何か案は?

編集

この問題は、VTK 5.10 と VTK 6 の違いによるものだと思います。

別のアプローチを使用して多角形選択を実装することができました。将来、何らかの多角形選択を実装する予定がある場合は、次の手順が役立つ場合があります。

vtkInteractorStyleDrawPolygon をサブクラス化し、OnLeftButtonUp() メソッド内に次の手順を実装しました。

  1. ボタンを離すとポイントを獲得:std::vector<vtkVector2i> points = this->GetPolygonPoints();

  2. ポイントを vtkDoubleArray に挿入する

  3. vtkDoubleArray を vtkPolygon に挿入します

  4. ポリゴンの numPoints、法線、境界を取得します。

  5. ポリゴン データ pts 内の double 配列へのポインターを取得します。

    pts = static_cast<double*>(polygon->GetPoints()->GetData()->GetVoidPointer(0);
    
  6. vtkPolyData の各点 P に対して、次のことを行います。

    inside = polygon->PointInPolygon(P,numPoints, pts, bounds,normal)
    
  7. 内部 == 1 の場合に vtkSelection にポイントを追加します

4

0 に答える 0