【发布时间】:2014-12-15 16:07:32
【问题描述】:
我正在尝试在 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;
}
这是结果:
【问题讨论】:
-
将结果存储在缓冲区中并使用不同的矩阵多次绘制该缓冲区
-
@ratchetfreak 谢谢!这已经是我可以使用的非常有用的技巧了。我编辑了这个问题,因为我正在寻找有关如何修改 gluLookAt 调用的更深入的答案。再次感谢!
-
我不知道为什么人们在没有解释原因的情况下将问题降级。我正在努力寻找解决方案并寻求帮助。
-
由于格式问题和缺少MCVE,我投了反对票。
-
虽然使用现代结构是最好的,但您可以通过将大的
for循环分成四个其他循环并在每个循环之前调用glColor来节省iterations-4对glColor的调用.除了循环内的所有比较和函数调用开销之外,它还可以让 OpenGL 驱动程序更有效地工作。