c++ - glutMotionFunc“翻转”问题
问题描述
我在这里需要一些真正的 OpenGL 故障排除。我正在使用 OpenGL 和 Freeglut
我使用 和 的组合进行了适当的场景旋转(有点像 3pp glutMotionFunc();
)glRotatef();
。
这是我的旋转功能:
float xrot = 0, yrot = 0, zrot = 0, lastx, lasty, lastz;
void mouseMovement(int x, int y)
{
int diffx = x - lastx;
int diffy = y - lasty;
lastx = x;
lasty = y;
xrot += (float)diffy;
yrot += (float)diffx;
}
我的显示功能:
void display(void)
{
glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f, 0.0f, -cRadius);
glRotatef(xrot, 1.0, 0.0, 0.0);
glRotatef(yrot, 0.0, 1.0, 0.0);
glBegin(GL_LINES);
---------
----
glEnd();
glTranslated(-xpos, 0.0f, zpos);
glutSwapBuffers();
}
最后是主要功能:
int main(int argc, char **argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow("Window");
glutDisplayFunc(display);
glutIdleFunc(display);
glutMotionFunc(mouseMovement);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
现在,当我加载时,场景渲染得很好,当我用鼠标(LMB)单击并拖动场景时,旋转会顺利进行。
唯一的问题是,在通过拖动旋转场景期间,场景在开始旋转之前会翻转到不同的位置。即,当我再次单击并拖动时,场景的旋转不会从我在上一次鼠标拖动事件中离开的位置继续,而是翻转到一些随机的 xrot 和 yrot 位置。
希望我说清楚。如果有人可以尝试复制相同的内容并提供一些关于此处可能存在的问题的见解,那将很有帮助。
这也是我的重塑功能,以防万一这里也缺少任何东西
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (GLfloat)w / (GLfloat)h, 0.1, 500.0);
glMatrixMode(GL_MODELVIEW);
}
解决方案
该问题是由于未初始化lastx
而引起的。lasty
当第一次调用回调时,它们没有说明先前的缪斯位置mouseMovement
,这导致第一次旋转是随机的。注意,和
的值在设置之前被读取:lastx
lasty
int diffx = x - lastx; int diffy = y - lasty; lastx = x; lasty = y;
glutMouseFunc
您可以通过实现回调来解决这个问题。设置lastx
并lasty
在回调中,所以当按下鼠标按钮时变量被初始化:
void mouseFunc(int button, int state, int x, int y) {
lastx = x;
lasty = y;
}
int main(int argc, char **argv) {
// [...]
glutMouseFunc(mouseFunc);
// [...]
}
推荐阅读
- linux - 有没有办法在使用 sdiff 时着色高光差异?
- google-apps-script - 从 Gmail 邮件中检索数据
- python - 如何在密码模式下更改 QLineEdit 项目符号的颜色
- function - pycparser 检索函数调用层次结构
- c# - 如何在 Asp Net Core Idenity 中更改两因素身份验证代码的生命周期?
- hyperledger-fabric - Fabric v1.4 私有数据示例中的链码调用错误
- perl - 在 perl 中使用 egrep 并遍历目录
- functional-programming - 具有多参数和条件的 Ramda
- c# - EventLog 服务帐户 (NT SERVICE\EventLog) 找不到或无法访问发布者 MyTestSource 资源
- java - 在 Java 中获取一年中的所有双周日期