2017-12-12 8 views
0

LinuxでVTK-6.2、C++(gcc-4.7.2)を使用していますが、次のVTKパイプラインセットアップがあります(実装、詳細、パイプラインに重点を置いてください):cone-> filter-> >俳優):VTKパイプラインアップデート

// cone/initialize 
vtkConeSource cone; 

// add cone(s) to filter 
vtkAppendFilter filter; 
filter.AddInputData(cone.GetOutput()); 

// add filter to mapper 
vtkDataSetMapper mapper; 
mapper.SetInputData(filter->GetOutput()); 

// actor 
vtkActor actor; 
actor.SetMapper(mapper); 

シーンがきれいにレンダリングされます。

問題

私は、元のデータ(すなわち、コーン)、正しくレンダリングされる俳優を更新したいです。

  • 俳優だけがいる場合はどうすれば元のコーンデータにアクセスできますか?これは、俳優も更新されることを保証しますか?元のデータを(ポインタを使用して:実装全体がvtkSmartPointerである)追跡してから、その属性の一部を変更すると、パイプラインが更新されないためです。自動的に更新してはいけませんか?

  • (私は俳優(例えば、視認性)を変更すると、シーンが細かいレンダリング)

は私を許して、私はVTKの専門家ではないですし、パイプラインが混乱しています。おそらく1つのアプローチは私のパイプラインを単純化することでしょう。

おかげ

[更新]

vtkAppendFilterに添加された場合vtkUnstructuredGridに)同様のポストへthis回答によれば、元データ(vtkConeSource)が形質転換されるので、私は追跡する場合であっても元のデータの変更は無駄です。

答えて

0

VTKパイプラインは、デマンド駆動パイプラインです。パイプラインの要素の1つが変更されても自動的には更新されません。パイプライン全体を更新するには、最後のvtkAlgorithm(またはその派生クラスオブジェクト)のUpdate()関数をパイプラインの明示的に呼び出す必要があります。我々はvtkAlgorithmタイプに由来する2つのオブジェクトを接続する際にパイプラインを設定するための正しい方法である

currAlgoObj->SetInputConnection(prevAlgoObj->GetOutputPort()) 

代わりに

currAlgoObj->SetInputData(prevAlgo->GetOutput()) 

を使用することであるそれからへのポインタを使用してパイプラインを更新することができ以下の例のようにactor->GetMapper()->Update()を実行してアクターオブジェクトを作成します。

この例では、コーンソースからコーンを作成し、それをvtkAppendFilterに渡して元のコーンソースの高さを変更し、別のウィンドウでレンダリングして更新されたコーンを表示します。 (更新された円錐を2番目のウィンドウに表示するには、最初のレンダリングウィンドウを閉じる必要があります)。

#include <vtkConeSource.h> 
#include <vtkDataSetMapper.h> 
#include <vtkActor.h> 
#include <vtkRenderer.h> 
#include <vtkRenderWindow.h> 
#include <vtkRenderWindowInteractor.h> 
#include <vtkSmartPointer.h> 
#include <vtkAppendFilter.h> 

int main(int, char *[]) 
{ 
    // Set up the data pipeline 
    auto cone = vtkSmartPointer<vtkConeSource>::New(); 
    cone->SetHeight(1.0); 

    auto appf = vtkSmartPointer<vtkAppendFilter>::New(); 
    appf->SetInputConnection(cone->GetOutputPort()); 

    auto coneMapper = vtkSmartPointer<vtkDataSetMapper>::New(); 
    coneMapper->SetInputConnection(appf->GetOutputPort()); 

    auto coneActor = vtkSmartPointer<vtkActor>::New(); 
    coneActor->SetMapper(coneMapper); 

    // We need to update the pipeline otherwise nothing will be rendered 
    coneActor->GetMapper()->Update(); 

    // Connect to the rendering portion of the pipeline 
    auto renderer = vtkSmartPointer<vtkRenderer>::New(); 
    renderer->AddActor(coneActor); 
    renderer->SetBackground(0.1, 0.2, 0.4); 

    auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); 
    renderWindow->SetSize(200, 200); 
    renderWindow->AddRenderer(renderer); 

    auto renderWindowInteractor = 
      vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
    renderWindowInteractor->SetRenderWindow(renderWindow); 
    renderWindowInteractor->Start(); 

    // Change cone property 
    cone->SetHeight(10.0); 

    //Update the pipeline using the actor object 
    coneActor->GetMapper()->Update(); 

    auto renderer2 = vtkSmartPointer<vtkRenderer>::New(); 
    renderer2->AddActor(coneActor); 
    renderer2->SetBackground(0.1, 0.2, 0.4); 

    auto renderWindow2 = vtkSmartPointer<vtkRenderWindow>::New(); 
    renderWindow2->SetSize(200, 200); 
    renderWindow2->AddRenderer(renderer2); 

    auto renderWindowInteractor2 = 
      vtkSmartPointer<vtkRenderWindowInteractor>::New(); 
    renderWindowInteractor2->SetRenderWindow(renderWindow2); 

    renderWindowInteractor2->Start(); 

    return EXIT_SUCCESS; 
} 
+0

徹底的な答えと例Amitをありがとう。 あなたが言及したように、問題は実際には '' SetInputConnection''の代わりに '' SetInputData''を使用していました(私の場合 '' AddInputData''が '' AddInputConnection''に変更されました) –

+0

Ok。私は 'AddInputData'に気付きませんでしたが、うまくいきました。 –