glRotatef 在 wirecube 上产生结果
glRotatef results on a wirecube
我正在使用一个 rand() 函数来和 x 变量和 y 变量在 glRotatef 中使用。兰德工作得很好。正在发生的事情是,当我在 X 和 Y 中都得到 0 值时,立方体通过收缩和膨胀来波动。我已经尝试了几种方法来确保这种情况不会发生,但唉,我在这里。这是我正在使用的功能:
void initRandoms()
{
maxCubes = rand() % (CUBE_HIGH - CUBE_LOW + 1) + CUBE_LOW;
for (int i = 0; i < maxCubes; i++)
{
cubeOrigins[i].x = X_LOW + (float)rand() / (float)RAND_MAX * (X_HIGH - X_LOW);
cubeOrigins[i].y = Y_LOW + (float)rand() / (float)RAND_MAX * (Y_HIGH - Y_LOW);
//cubeOrigins[i].z =
cubeOrigins[i].size = SIZE_LOW + (double)rand() / (double)RAND_MAX * (SIZE_HIGH - SIZE_LOW);
cubeOrigins[i].rotateX = rand() % 2;
cubeOrigins[i].rotateY = rand() % 2;
}
正如我之前所说,每个立方体将在 X 轴、Y 轴、XY 轴上旋转或收缩和膨胀。这是我需要删除的收缩和膨胀,对应于 0 = X 和 0 = Y。我可以有 X = 0 或 Y = 0。我尝试的是一些条件,但发生的事情是我取出收缩和膨胀,但随后所有立方体都沿同一方向旋转。我希望有人能弄清楚我做错了什么,并向我展示我需要做什么。感谢大家的帮助。如果需要,我会放更多的代码。
这是使用上述函数的myDisplay函数。上述函数也在 main 中调用:
void myDisplay()
{
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
for(int i = 0; i < maxCubes; i++)
{
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -120.0);
glTranslatef(cubeOrigins[i].x, cubeOrigins[i].y, cubeZ);
glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
//glRotatef(rotateAxis, 1, 1, 0);
glutWireCube(cubeOrigins[i].size);
}
cubeZ += 0.050f;
glutSwapBuffers();
glFlush();
if (cubeZ > 120.0f)
{
cubeZ -= 100.f;
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
for(int i = 0; i < maxCubes; i++)
{
initRandoms();
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -120.0);
glTranslatef(cubeOrigins[i].x, cubeOrigins[i].y, cubeZ);
glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
//glRotatef(rotateAxis, 1, 1, 0);
glutWireCube(cubeOrigins[i].size);
}
cubeZ += 0.050f;
glutSwapBuffers();
glFlush();
}
}
查看您的代码,我可以看到您正在使用此函数旋转多维数据集:
glRotatef(rotateAxis, cubeOrigins[i].rotateX, cubeOrigins[i].rotateY, 0.0f);
问题是:当cubeOrigins[i].rotateX和cubeOrigins[i].rotateY都为零时会发生什么?OpenGL 使用称为四元数 (http://www.opengl.org/sdk/docs/man2/xhtml/glRotate.xml) 的数学函数旋转矩阵,当 x、y 和 z 为零时,我猜(因为你违反了它的前提之一,即 ||x, y, z||必须为 1) 它简化为此矩阵:
|cos(angle) 0 0 0|
| 0 cos(angle) 0 0|
| 0 0 cos(angle) 0|
| 0 0 0 1|
它本质上是一个比例矩阵。这解释了你之前提到的收缩和膨胀的效果。
因此,正如您之前所观察到的,您需要避免这种情况。
其次,您对所有立方体使用相同的rotateAxis
。因此,每个具有相同 cubeOrigins[i].rotateX 和 cubeOrigins[i].rotateY 的立方体都将获得相同的旋转。您需要在此处获得一些变化(更改每个立方体的旋转轴)
最后,您不需要同时调用两者:
glutSwapBuffers();
glFlush();
glutSwapBuffers() 已经调用,内部 glFlush
首先要做的事
(我不确定你是否已经这样做了,但是)
在使用 C rand() 方法之前,您需要给它一个种子,以便使用 srand() 函数获得"真实"随机数
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 用C++20 fmt限制结果的总大小
- 如何返回一个类的两个对象相加的结果
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 序列化,没有库的整数,得到奇怪的结果
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 在更改for循环的第三部分后,未使用for循环结果
- 使用++运算符会导致意外的结果
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- C++Brute Force攻击函数不会返回结果
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 算术运算的结果类似于:C浮点变量中的1/3
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 密码登录程序将永远循环并显示不正确的结果
- 如何让C++'tally up'结果并制定计划?
- 为什么这个程序的结果是3 "born"?和 4 死
- glRotatef 在 wirecube 上产生结果