如何解决我认为应该在不应该的时候调用随机数生成器
||#include \"std_lib_facilities.h\"
#include <GL/glut.h>
static float dx=0.0;
static float dz=10;
static float points[2];
static float cx=0.0;
static float cy=0.0;
static float cz=0.0;
static float spin=0.0;
static float rotation=1.0;
int readobject()
{
ifstream inputFile(\"spikeBall.ogl\");
if(!inputFile)
{
cerr << \"cannot open file spikeBall.ogl\" << endl;
return -1;
}
int count = 0;
float x,y,z;
do{
inputFile >> count;
glBegin(GL_polyGON);
for(int i=0;i<count;i++)
{
inputFile >> x >> y >> z;
glVertex3f(((x/5)+cx),((y/5)+cy),((z/5)+cz));
}
glEnd();
}while(count!=0);
inputFile.close();
}
void init(void)
{
glClearColor(0.0,0.0,0.0);
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glLoadIdentity();
gluLookAt (0,20,1.0,0.0);
glPushmatrix();
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
GLfloat aMaterial[]={0.1745,0.01175,1.0};
GLfloat bMaterial[]={0.61424,0.04136,1.0};
GLfloat cMaterial[]={0.727811,0.626959,1.0};
GLfloat dMaterial=40;
glMaterialfv(GL_FRONT,GL_AMBIENT,aMaterial);
glMaterialfv(GL_FRONT,GL_DIFFUSE,bMaterial);
glMaterialfv(GL_FRONT,GL_specular,cMaterial);
glMaterialf(GL_FRONT,GL_SHINInesS,dMaterial);
readobject();
glrotatef(spin,0.0);
glPopMatrix();
glFlush();
}
void idleFunc(void)
{
spin+=rotation;
if(spin>360.0)
{
spin-=360.0;
}
cz+=0.1;
if(cz=20)
{
srand((unsigned int) time(NULL));
for(int i=0;i<2;i++)
{
points[i] = (rand()%20)-10;
}
cx = points[0];
cy = points[1];
cz = 0;
GLfloat lightPos[] = {cx,cy,(cz+2),1.0};
glLightfv(GL_LIGHT0,GL_POSITION,lightPos);
std::cout << \"cx:\" << cx;
std::cout << \"cy:\" << cy;
std::cout << \"cz:\" << cz;
}
else
{
}
glutPostRedisplay();
}
void reshape (int w,int h)
{
glViewport (0,(GLsizei) w,(GLsizei) h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0,(GLfloat) w/(GLfloat) h,20.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc,char** argv)
{
glutinit(&argc,argv);
glutinitdisplayMode(gluT_SINGLE | gluT_RGB | gluT_DEPTH);
glutinitwindowSize(300,300);
glutinitwindowPosition(0,0);
glutCreateWindow(\"3ds Max loader\");
glutdisplayFunc(display);
glutReshapeFunc(reshape);
init();
glutIdleFunc(idleFunc);
glutMainLoop();
return(0);
}
我在3ds max中制作了一个尖尖的球体,然后将其导出为.obj,并通过一些python,我得到了.ogl文件,我希望它向屏幕方向移动,然后返回到x和y轴上的随机点,但是它一直保持弹跳
解决方法
cz+=0.1;
if(cz=20)
{
[random generator code]
}
这里有两个问题:
首先,您将(=
)20分配给cz
而不是进行比较(==
)-更糟糕的是,它的计算结果为true,并始终触发方括号内的代码。您也许应该考虑将编译器切换到更详细的警告模式和/或更仔细地阅读警告。
其次,您永远不应该将浮点数与严格相等进行比较,而应使用<=
或>=
,因为由于浮点算术您很可能会错过该点-请参阅此链接f.e.如果您不熟悉该问题。因此,更正后的代码应如下所示:
cz += 0.1;
if (cz >= 20)
{
[...]
}
,之所以调用rand()
节,是因为cz=20
始终返回一个真表达式。你应该改变
if(cz=20)
至
if(cz==20)
也许>=
会是一个更好的运算符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。