Как использовать vtkHardwareSelector?

Я строю простой инструмент для манипулирования облаками точек. Я хочу иметь возможность сделать полигональный выбор при перемещении мыши. Я работаю с VTK 5.10 и QVTKWidget в Ubuntu 12.04.

Для этого я создал класс polygonalSelector, изменив тестовый файл: TestPolygonSelection.cxx по адресу https://github.com/Kitware/VTK/blob/master/Rendering/Core/Testing/Cxx/TestPolygonSelection.cxx. необходимо использовать VTK 5.10 вместо vtk 6, как описано здесь: (обратите внимание, что мне нужно использовать старую версию) 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;
  }

Я никогда не преодолеваю эту точку, потому что она всегда возвращает ложь. Я понятия не имею, как установить 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? В справочнике по классам говорится, что "программисты приложений должны обычно использовать vtkRenderWindow вместо конкретной версии OpenGL".

Есть идеи?

РЕДАКТИРОВАТЬ

Я считаю, что проблема связана с различиями ВТК 5.10 и ВТК 6.

Мне удалось реализовать полигональный выбор, используя другой подход. Если кто-то намеревается реализовать какой-либо полигональный выбор в будущем, он может счесть эти шаги полезными:

Я подклассифицировал vtkInteractorStyleDrawPolygon и реализовал следующие шаги внутри метода OnLeftButtonUp():

  1. Получите очки при отпускании кнопки: std::vector<vtkVector2i> points = this->GetPolygonPoints();

  2. Вставьте точки в vtkDoubleArray

  3. Вставьте vtkDoubleArray в vtkPolygon

  4. Получите numPoints, нормаль и границы полигона.

  5. Получить указатель на двойной массив внутри данных многоугольника pts.

    pts = static_cast<double*>(polygon->GetPoints()->GetData()->GetVoidPointer(0);
    
  6. Для каждой точки P в vtkPolyData выполните:

    inside = polygon->PointInPolygon(P,numPoints, pts, bounds,normal)
    
  7. Добавьте очки к vtkSelection, когда внутри == 1

0 ответов

Другие вопросы по тегам