我正在编写一些 OpenGL/Glut 函数来可视化我的流体动力学代码的结果(全部在 C++ 中)。 我的数据存储在声明为全局的矩阵中。
伪代码如下:
class fluid_dynamics{
//...
void set_conditions(); // Here is my opengl init function
void solve(); // This is an iterative loop with stop criteria
void IterateLoop();
}
在 solve() 函数上我有一个循环。
void fluid_dynamics::solve(){
glutDisplayFunc(DisplayMatrix);
IterateLoop( // here I update my data each n-steps
// and I want to update my "scene" every time I do that.
);
glutMainLoop();
我对 OpenGL 很陌生,但据我所知,在 IterateLoop() 函数中使用 glutPostRedisplay() 直到循环完成后才会执行新图像(因为 glutPostRedisplay() 只设置一个标志并等待空闲状态),所以...有什么想法吗? (1)
可以使用 glutIdleFunc 吗? 或指向 IterateLoop 的 glutTimerFunc 将 Loop 分成小部分? (在那种情况下,应该如何从类内部将 void 指针传递给类成员?:S)
注意;我可以重写代码,所以我接受每一个建议,但我认为将我所有的流体动力学操作都放在一个类中是很重要的。
最佳答案
从概念上讲,渲染和求解是两个不同的东西,你不应该直接在求解器中进行渲染。这样想:您的求解器可以在没有任何 GUI 的情况下完成它的工作,因此 GUI 只是位于它之上的东西。所以把它放在不同的类中。
有两种基本方法:线程化和非线程化。您的求解器包含当前时间的当前状态,并且应该能够将其状态推进到下一个时间范围。因此,您可以在 glutIdleFunc
中进行求解(一次迭代),这有点难看:
solver* g_solver;
void step()
{
g_solver->step();
}
int main()
{
...
g_solver = &solver;
glutIdleFunc(&step);
}
或者在单独的线程中进行求解,存储状态,让 OpenGL 线程获取它进行渲染。
其中一个方面是您不一定知道计算下一个状态所花费的时间是否与从一帧到下一帧的时间有任何关系,但您的问题并没有说明这是否是问题。
关于c++ - 如何更新迭代(for 循环)求解器中的粒子位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16742502/