VTK:在vtkRenderWindowInteractior处于活动状态时,以编程方式旋转actor
VTK: Rotate actor programmatically while vtkRenderWindowInteractor is active
我正在尝试使用vtkActor::RotateZ
旋转vtkActor
,然后调用vtkRenderWindow::Render
。它工作得很好(它旋转演员),但我不能移动、调整大小,甚至不能聚焦窗口。
我怀疑这是由于没有捕获操作系统事件引起的,所以我在混合中添加了一个vtkRenderWindowInteractor
。现在我可以移动、调整窗口大小和聚焦窗口,但演员不再旋转了。
我已经在下面的代码片段中隔离了代码,注释行43可以看到这两种效果:
renderWindowInteractor->Start();
我正在使用mingw-w64(GCC 4.9.1)编译VTK 6.2,运行在Windows 8.1中。我已经在这个回购中上传了一个小的CMake设置的代码,所以你可以很容易地测试它。
谢谢你的帮助!
constexpr float planeWidth = 200.0f;
constexpr float planeHeight = 100.0f;
int main()
{
auto renderer = vtkRenderer::New();
// Create render window
auto renWin = vtkRenderWindow::New();
renWin->AddRenderer(renderer);
renWin->SetSize(600,600);
// Create a plane
auto texturedPlane = vtkActor::New();
auto plane = vtkPlaneSource::New();
plane->SetOrigin(0, planeHeight, 0);
plane->SetPoint1(planeWidth, planeHeight, 0);
plane->SetPoint2(0, 0, 0);
auto planeMapper = vtkPolyDataMapper::New();
planeMapper->SetInputConnection(plane->GetOutputPort());
texturedPlane->SetMapper(planeMapper);
texturedPlane->SetOrigin(planeWidth / 2, planeHeight, 0);
renderer->AddActor(texturedPlane);
renderer->ResetCamera();
// Create a RenderWindowInteractor
auto renderWindowInteractor = vtkRenderWindowInteractor::New();
renderWindowInteractor->SetRenderWindow(renWin);
renderWindowInteractor->Start(); // <-- Comment this line!
// Render
float rot = 0.0f;
while(true)
{
texturedPlane->SetOrientation(0,0,0);
texturedPlane->RotateZ(rot++);
renWin->Render();
}
}
使用asdfasdf的解决方案解决:(本回购中的代码)
constexpr float planeWidth = 200.0f;
constexpr float planeHeight = 100.0f;
vtkActor * texturedPlane;
vtkRenderWindowInteractor * renderWindowInteractor;
vtkRenderWindow * renWin;
float rot = 0.0f;
class RotateCommand : public vtkCommand
{
public:
vtkTypeMacro(RotateCommand, vtkCommand);
static RotateCommand * New()
{
return new RotateCommand;
}
void Execute(vtkObject * vtkNotUsed(caller),
unsigned long vtkNotUsed(eventId),
void * vtkNotUsed(callData))
{
texturedPlane->SetOrientation(0,0,0);
texturedPlane->RotateZ(rot++);
renWin->Render();
}
};
int main()
{
auto renderer = vtkRenderer::New();
// Create render window
renWin = vtkRenderWindow::New();
renWin->AddRenderer(renderer);
renWin->SetSize(600,600);
// Create a plane
texturedPlane = vtkActor::New();
auto plane = vtkPlaneSource::New();
plane->SetOrigin(0, planeHeight, 0);
plane->SetPoint1(planeWidth, planeHeight, 0);
plane->SetPoint2(0, 0, 0);
auto planeMapper = vtkPolyDataMapper::New();
planeMapper->SetInputConnection(plane->GetOutputPort());
texturedPlane->SetMapper(planeMapper);
texturedPlane->SetOrigin(planeWidth / 2, planeHeight, 0);
renderer->AddActor(texturedPlane);
renderer->ResetCamera();
// Create a RenderWindowInteractor
renderWindowInteractor = vtkRenderWindowInteractor::New();
renderWindowInteractor->SetRenderWindow(renWin);
renderWindowInteractor->Initialize();
renderWindowInteractor->CreateRepeatingTimer(1);
RotateCommand * rotateCallback = RotateCommand::New();
renderWindowInteractor->AddObserver(vtkCommand::TimerEvent, rotateCallback );
renderWindowInteractor->Start();
}
破解以解决部分问题。
vtkRenderWindowInteractor * renderWindowInteractor;
constexpr float planeWidth = 200.0f;
constexpr float planeHeight = 100.0f;
class CommandSubclass2 : public vtkCommand
{
public:
vtkTypeMacro(CommandSubclass2, vtkCommand);
static CommandSubclass2 *New()
{
return new CommandSubclass2;
}
void Execute(vtkObject *vtkNotUsed(caller), unsigned long vtkNotUsed(eventId),
void *vtkNotUsed(callData))
{
std::cout << "timer callback" << std::endl;
renderWindowInteractor->ExitCallback();
}
};
int main()
{
auto renderer = vtkRenderer::New();
// Create render window
auto renWin = vtkRenderWindow::New();
renWin->AddRenderer(renderer);
renWin->SetSize(600,600);
// Create a plane
auto texturedPlane = vtkActor::New();
auto plane = vtkPlaneSource::New();
plane->SetOrigin(0, planeHeight, 0);
plane->SetPoint1(planeWidth, planeHeight, 0);
plane->SetPoint2(0, 0, 0);
auto planeMapper = vtkPolyDataMapper::New();
planeMapper->SetInputConnection(plane->GetOutputPort());
texturedPlane->SetMapper(planeMapper);
texturedPlane->SetOrigin(planeWidth / 2, planeHeight, 0);
renderer->AddActor(texturedPlane);
renderer->ResetCamera();
// Create a RenderWindowInteractor
renderWindowInteractor = vtkRenderWindowInteractor::New();
renderWindowInteractor->SetRenderWindow(renWin);
renderWindowInteractor->Initialize();
renderWindowInteractor->CreateRepeatingTimer(1);
vtkSmartPointer<CommandSubclass2> timerCallback = vtkSmartPointer<CommandSubclass2>::New();
renderWindowInteractor->AddObserver ( vtkCommand::TimerEvent, timerCallback );
// Render
float rot = 0.0f;
while(true)
{
renderWindowInteractor->Start(); // <-- Comment this line!
texturedPlane->SetOrientation(0,0,0);
texturedPlane->RotateZ(rot++);
renWin->Render();
}
}
如果我没有给你任何其他回复,我很抱歉,但由于这个解决方案很糟糕,我一直在等待其他人找到更好的解决方案,但似乎没有人回答你,所以我会这么做。
你几乎可以猜到它的作用。交互开始后每1ms,就会调用一个回调,停止交互并进行旋转。
相关文章:
- 使用 Gtkmm 以编程方式选择 Gtk::TextView 中的文本
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何以编程方式将音频从任何录制设备路由到任何播放设备
- 我是否可以使用 win32 句柄以编程方式记录发送到/接收到 USB/COM 的内容
- 如何以编程方式使窗口全屏显示?
- 终端如何在 shell 提示符下以编程方式阻止退格,以便您无法在其上退格,例如 $ 表示 bash 或 C:\blah\>
- 如何使用打印到 PDF 打印机在 MFC 和 CView 中以编程方式打印而不提示输入文件名?
- 如何以编程方式显示功能区按钮的下拉菜单?
- 是否可以以编程方式构造 std::initializer_list?
- 在 Visual C++ 中以编程方式更改按钮的背景图像
- 附加调试器并以编程方式获取变量地址 Visual Studio
- 以编程方式重新连接断开的 VHD 链
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- 以编程方式在任何按钮上突出显示 Qt 鼠标悬停按钮
- 以编程方式防止重命名或删除文件,但仍使其可写
- 以编程方式连接子图
- 如何以编程方式区分在内存的堆和堆栈部分创建的对象
- 如何以编程方式从PKCS7中提取CA、多个CA和公共证书/密钥
- 如何以编程方式将路由添加到网络接口
- 以编程方式在 C++ 中创建函数