我正在尝试使用OpenGL在3D空间中模拟Lorenz吸引子。我在显示功能中编写了以下代码:
void display()
{
// Clear the image
glClear(GL_COLOR_BUFFER_BIT);
// Reset previous transforms
glLoadIdentity();
// Set view angle
glRotated(ph,1,0,0);
glRotated(th,0,1,0);
glColor3f(1,1,0);
glPointSize(1);
float x = 0.1, y = 0.1, z = 0.1;
glBegin(GL_POINTS);
int i;
for (i = 0; i < initialIterations; i++) {
// compute a new point using the strange attractor equations
float xnew = sigma*(y-x);
float ynew = x*(r-z) - y;
float znew = x*y - b*z;
// save the new point
x = x+xnew*dt;
y = y+ynew*dt;
z = z+znew*dt;
glVertex4f(x,y,z,i);
}
glEnd();
// Draw axes in white
glColor3f(1,1,1);
glBegin(GL_LINES);
glVertex3d(0,0,0);
glVertex3d(1,0,0);
glVertex3d(0,0,0);
glVertex3d(0,1,0);
glVertex3d(0,0,0);
glVertex3d(0,0,1);
glEnd();
// Label axes
glRasterPos3d(1,0,0);
Print("X");
glRasterPos3d(0,1,0);
Print("Y");
glRasterPos3d(0,0,1);
Print("Z");
// Display parameters
glWindowPos2i(5,5);
Print("View Angle=%d,%d %s",th,ph,text[mode]);
// Flush and swap
glFlush();
glutSwapBuffers();
}
然而,我无法得到合适的吸引力。我相信x
,y
,z
的公式是正确的。我只是不确定如何以正确的方式显示它以获得正确的吸引力。谢谢你的帮助。以下是我的计划目前推出的内容:
您好
答案 0 :(得分:1)
好的,所以我遇到了这个问题,你想做一些事情,
首先,当您使用glVertex4f()
绘制点时,要将其更改为 glVertex3f 或将w值更改为1.使用 glVertex3f 它将设置w默认为1。 w值会改变点的缩放比例,这样你最终会得到一些疯狂的数字,其中i为50000左右。
第二次修复后,您会发现这些值超出了您的视觉范围,因此您需要将其缩小。我会在你绘制积分时这样做,所以在你的情况下我会使用glVertex3f(x*.05,y*.05,z*.05)
。如果.05太大或太小,请根据您的需要进行调整。
最后确保你的dt值是.001,你的起点应该是x,y和z的1左右。
然后理想情况下,您希望将所有这些点放在一个数组中,然后读取该数组以绘制您的点,而不是每次调用显示时都进行计算。所以在其他地方进行计算,然后发送点进行显示。希望这有帮助。