目前单纯使用openngl实现了物理仿真,主函数如下
int main(int argc, char * argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
glutInitWindowSize(1024, 1024);
glutCreateWindow("Mass-Spring Model");
initGL1();
glutDisplayFunc(OnRender);
//指定窗口形状变化时的回调函数
glutReshapeFunc(OnReshape);
glutMouseFunc(Mouse);
glutMotionFunc(Motion);
glutSpecialFunc(processSpecialKeys);
//指定程序空闲时调用函数
glutIdleFunc(StepPhysics);
glEnable(GL_DEPTH_TEST);
glutMainLoop();
return 0;
}
其中的绘制函数StepPhysics如下:
void StepPhysics(){
ComputeForces();
CalcPos();
glutPostRedisplay();
DynamicConstrain();
Sleep(15);
}
但是目前想将其与qt结合成一个界面:
目前实现的如下:
这只是没有添加物理引擎的状态,因此绳索没有物理属性,只是各点的初始位置:目前我所了解的知识要想结合qt需要三个函数:
这是目前没有添加物理引擎的函数内容,但是不知道该怎么结合单纯opengl中的函数实现实时物理仿真并绘制
void goudan::initializeGL()//在调用paintGL()之前被调用一次,设置openGL的绘图描述表,定义显示列表,以及执行其他的初始化
{
initGL1();//各点设置初始位置
qglClearColor(Qt::black);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
}
void goudan::resizeGL(int width, int height)//设置openGL视口,投影以及与其他窗口部件尺寸相关的设置
{
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (GLfloat)width / (GLfloat)height, 0.1f, 1000.0f);
glGetIntegerv(GL_VIEWPORT, viewport);
glGetDoublev(GL_PROJECTION_MATRIX, PP);
glMatrixMode(GL_MODELVIEW);
}
void goudan::paintGL()//需要重绘的时候调用
{
glClearColor(0.2, 0.2, 0.2, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0, 0, -zoom); //渲染场景
glTranslatef(tx, ty, 0);
glRotatef(G_fAngle_horizon, 0.0f, 1.0f, 0.0f);
glRotatef(G_fAngle_vertical, 1.0f, 0.0f, 0.0f);
glLightfv(GL_LIGHT1, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT1, GL_SPECULAR, specularLight);
glLightfv(GL_LIGHT1, GL_POSITION, lightPosition);
glTranslatef(0.0, 0.0, -G_fDistance);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHTING);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
drawTextile();//绘图函数
glDisable(GL_LIGHTING);
}
有大神知道该怎么构造并且实现和opengl相同的实时渲染功能么?