- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了一个 VTK 应用程序,它使用 vtkPoints > vtkPolyLine > vtkPolyData > vtkPolyDataMapper 生成螺旋并显示它。如果在程序初始化时静态完成,这很好用。现在,我想动态添加新的数据点。目的是实时可视化测量结果,因此将以特定时间间隔添加新数据。
目前,我刚刚实现了一个 TimerEvent 来更新 vtkPoints 和 vtkPolyLine。但是,该程序仅显示在启动 vtkRenderWindowInteractor 之前生成的静态数据。我还尝试对几乎所有对象使用“Modified()”和“Update()”调用,尝试删除、重新生成并向渲染器添加新角色——但没有成功!我在下面添加了我的 C++ 代码...
以下邮件列表问题是关于这个问题的,但给出的解决方案对我不起作用: http://public.kitware.com/pipermail/vtkusers/2006-November/038377.html
下面的问题好像是相关的,但是没有有用的答案: VTK: update data points in renderWindow at every simulation timestep
我使用的是 Visual Studio Community 2017 和 VTK 8.0.0,它们都编译为 Win32 目标。
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingContextOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
#include <vtkSmartPointer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkConeSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkPoints.h>
#include <vtkPolyLine.h>
vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkPolyLine> polyLine = vtkSmartPointer<vtkPolyLine>::New();
int numOfPoints = 0;
double t = 0;
void NextPoint() {
double x = t * cos(t);
double y = t * sin(t);
points->InsertNextPoint(x, y, t);
polyLine->GetPointIds()->InsertNextId(numOfPoints);
numOfPoints++;
t += 0.1;
}
vtkSmartPointer<vtkPolyData> generateEllipse() {
// Add some points so we actually see something at all...
for (int i = 0; i < 100; ++i) {
NextPoint();
}
vtkSmartPointer<vtkCellArray> cells = vtkSmartPointer<vtkCellArray>::New();
cells->InsertNextCell(polyLine);
vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
polyData->SetPoints(points);
polyData->SetLines(cells);
return polyData;
}
class vtkTimerCallback : public vtkCommand
{
public:
static vtkTimerCallback *New()
{
vtkTimerCallback *cb = new vtkTimerCallback;
cb->TimerCount = 0;
return cb;
}
virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId,
void *vtkNotUsed(callData))
{
if (vtkCommand::TimerEvent == eventId)
{
NextPoint(); // Add another point to polyData
++this->TimerCount;
cout << this->TimerCount << endl;
}
}
private:
int TimerCount;
};
int main(int argc, char** argv) {
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();
rwi->SetRenderWindow(renderWindow);
vtkSmartPointer<vtkPolyData> data = generateEllipse();
vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(data);
vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
actor->GetProperty()->SetDiffuseColor(255, 255, 0);
vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
renderWindow->AddRenderer(renderer);
renderer->AddActor(actor);
renderer->ResetCamera();
renderWindow->Render();
// Add Timer Event...
rwi->Initialize();
vtkSmartPointer<vtkTimerCallback> cb = vtkSmartPointer<vtkTimerCallback>::New();
rwi->AddObserver(vtkCommand::TimerEvent, cb);
int timerId = rwi->CreateRepeatingTimer(100); // every 100ms
std::cout << "timerId: " << timerId << std::endl;
// Start Displaying...
rwi->Start();
return 0;
}
最佳答案
问题是单元格不是按指针存储的 - 当您调用 cells->InsertNextCell(polyLine);
时,数据被复制,而不是指向,以便创建有效的存储数组中的单元格(整个实现实际上位于 vtkCellArray 的标题中,因此您可以查看)。所以当你更新 polyLine 时,它对 polydata 没有影响,因为 polydata 有自己的拷贝,你没有更新。以下代码适用于我(您必须公开 polydata 和 cellArray):
virtual void Execute(vtkObject *vtkNotUsed(caller), unsigned long eventId,
void *vtkNotUsed(callData))
{
if (vtkCommand::TimerEvent == eventId)
{
NextPoint(); // Add another point to polyData
cells->Initialize(); // reset the cells to remove the old spiral
cells->InsertNextCell(polyLine); // re-insert the updated spiral
cells->Modified(); // required to update
data->Modified(); // required to update
++this->TimerCount;
cout << polyLine->GetNumberOfPoints() << endl;
renderWindow->Render(); // refresh the render window after each update
}
}
关于c++ - 如何告诉 VTK 管道使用通过 TimerEvent 更新的新 vtkPolyData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45036575/
我需要每1毫秒触发一次计时器。 This文档报告,该插槽调用可能比虚拟函数调用要慢得多。 但是,如果我们将信号/插槽与事件发生进行比较,哪种机制会更快,更有效并且产生的开销更少:将QTimer与tim
意图 我编写了一个 VTK 应用程序,它使用 vtkPoints > vtkPolyLine > vtkPolyData > vtkPolyDataMapper 生成螺旋并显示它。如果在程序初始化时静
我的 QT 应用程序依赖于 TimerEvent (startTimer/killTimer) 来动画 GUI 组件。然而,最近,我在我的 Mac 笔记本电脑上编译并运行了我的应用程序(与我开发时所用
问题 我在调试应用程序的 timerEvent 函数时遇到困难。虽然应用程序能够运行,但如果我在如下所示的简单内容中设置断点,我会收到一条错误消息,指出:“gdb 进程已崩溃。” void MyCla
我正在尝试在 AS3/Flex 4 中编写一个简单的游戏,并且我正在尝试从一开始就找到处理代码定时执行的最佳方法。 最自然的方法是在整个程序中使用一堆 Timer 对象。然而,与 ENTER_FRAM
我的这个函数是 qtdlg.cpp 的一部分。这是这个类的构造函数: qtdlg::qtdlg() { timer1.start(100, this); // 100 msec updatin
我是一名优秀的程序员,十分优秀!