我正在尝试在 OpenGL 中实现一个能够绘制 Lorenz 系统的软件。我以静态方式实现了我的目的:系统只绘制一次,仅此而已。现在我想在系统周围移动我的相机并展示系统本身的 3D 特性。我注意到我无法更新绘制的图像,因为如果我更新系统的点,它们会在每次更新中不断变化(洛伦兹系统是数学方程的结果,因此我有很大的浮点数作为结果)。然后我意识到我必须只画一次系统,然后以某种方式围绕它移动相机。不幸的是我不知道该怎么做。为了我的目的,我在更改 gluLookAt 调用时尤其遇到问题。假设我想根据键盘给出的输入移动相机。你能帮帮我吗?在这里你可以看看我的简单代码。
初始化方法:
void myinit() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glColor4f(1.0f, 0.0f, 0.0f, 0.09f);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_POINT_SMOOTH);
glPointSize(1.0f);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
glViewport(0, 0, 400, 400); //glViewport(0, 0, width_of_window_rendering_area, height_of_window_rendering area);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f, (GLfloat)400/400, 0.1, 100); //Sets the frustum to perspective mode, sets up the way in which objects
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
绘图方法
void mydisplay() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //if perspective
glLoadIdentity();
gluLookAt(0.0, 0.0, 100.0, //position
0.0, 0.0, 0.0, //where we are looking
0.0, 1.0, 0.0); //up vector
glBegin(GL_POINTS);
for (int i = 0; i < iterations; i++) {
if(i == 200000){
glColor4f(1.0f, 0.0f, 0.0f, 0.09f);
}
if(i == 400000){
glColor4f(1.0f, 0.0f, 1.0f, 0.09f);
}
if(i == 600000){
glColor4f(0.0f, 0.0f, 1.0f, 0.09f);
}
if(i == 800000){
glColor4f(0.0f, 1.0f, 1.0f, 0.09f);
}
// compute a new point using the strange attractor equations
float xnew=x + h*(s*(y - x));
float ynew=y + h*(x*(p - z) - y);
float znew=z + h*(x*y - b*z);
x = xnew;
y = ynew;
z = znew;
glVertex3f(x, y, z);
}
glEnd();
glutSwapBuffers();
}
主要的
int main (int argc, char **argv){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(400, 400);
glutCreateWindow("Strange Attractors in C++ and OpenGL Tutorial");
glutDisplayFunc(mydisplay);
glutKeyboardFunc(mykey);
myinit();
glutMainLoop();
while(esc != true){
glutDisplayFunc(mydisplay);
}
return 0;
}
这是结果: