2

QTで3Dオブジェクトを表示するために、VTKをqvtkwidgetとして使用しています。独自の修正されたインタラクション スタイルを作成することで、そのインタラクション スタイルを変更できることを知っています。それぞれ右クリックと左クリックを押したままにして、オブジェクトを回転および移動したい。そして、ヘッダーファイルに変更された相互作用スタイルのクラスを作成しようとしましたが、変更された相互作用スタイルで他のクラスで宣言された関数を使用するのにいくつかの困難があります。これは単純なはずです。誰もこれについて知っていますか?

  boxWidget.at(boxWidget.count()-1)->SetInput(reader->GetOutput());
        boxWidget.at(boxWidget.count()-1)->SetScalingEnabled(0); //turn this on to be able to resize the model
        boxWidget.at(boxWidget.count()-1)->SetRotationEnabled(0);
        boxWidget.at(boxWidget.count()-1)->SetInteractor(this->ui->qvtkWidget->GetInteractor());
        boxWidget.at(boxWidget.count()-1)->GetInteractor()->SetInteractorStyle(MyStyle::New());  /

BoxWidget は、「MyStyle」を適用しようとしているオブジェクトであり、以下は MyStyle クラスです

class MyStyle : public vtkInteractorStyleTrackballCamera , public MainWindow
{
private:
unsigned int NumberOfClicks;
int PreviousPosition[2];
int ResetPixelDistance;
public:
static MyStyle *New();

vtkTypeMacro(MyStyle, vtkInteractorStyleTrackballCamera);

PeterStyle() : NumberOfClicks(0) , ResetPixelDistance(5)
{
    this->PreviousPosition[0] = 0;
    this->PreviousPosition[1] = 0;
}

virtual void OnLeftButtonDown()
{
    qDebug() << "My Style Mouse Left Clicked";
    //std::cout << "Pressed left mouse button." << std::endl;
    this->NumberOfClicks++;
    //std::cout << "NumberOfClicks = " << this->NumberOfClicks << std::endl;
    int pickPosition[2];
    this->GetInteractor()->GetEventPosition(pickPosition);

    int xdist = pickPosition[0] - this->PreviousPosition[0];
    int ydist = pickPosition[1] - this->PreviousPosition[1];

    this->PreviousPosition[0] = pickPosition[0];
    this->PreviousPosition[1] = pickPosition[1];

    int moveDistance = (int)sqrt((double)(xdist*xdist + ydist*ydist));

    // Reset numClicks - If mouse moved further than resetPixelDistance
    if(moveDistance > this->ResetPixelDistance)
    {
        this->NumberOfClicks = 1;
    }


    if(this->NumberOfClicks == 2)
    {
        vtkSmartPointer<vtkCamera> camera =
            vtkSmartPointer<vtkCamera>::New();
        camera->SetPosition(140.0, 155.0, 590.0);
        camera->SetFocalPoint(140.0, 155.0, 0.0);
        camera->SetClippingRange(590.0, 600.0);

        this->GetCurrentRenderer()->SetActiveCamera(camera);
        qDebug() << "Double clicked.";
        this->NumberOfClicks = 0;
    }
    // forward events
    vtkInteractorStyleTrackballCamera::OnLeftButtonDown();
}

左クリックでオブジェクトを移動するために何を変更すればよいかわかりません。

4

1 に答える 1

0

左ボタンでオブジェクトを移動することだけを考えている場合は、独自のインタラクション スタイルをサブクラス化する必要はありません。カメラを操作せずにマウスでアクターを制御できるスタイルがvtk既に実装されています。vtkInteractorStyleTrackballActorその後、それをオーバーライドして、必要なことを行うことができます。

于 2016-06-29T13:56:37.633 に答える