gpt4 book ai didi

c++ - OpenGL,围绕一个点的旋转仍然围绕原点不起作用

转载 作者:行者123 更新时间:2023-11-30 01:26:43 24 4
gpt4 key购买 nike

我做了(平移、旋转、平移)操作,但它仍然围绕原点旋转。我所做的就是当你按下 r 键时,技巧就会开始,即(平移、旋转、平移)。结果是它仍然围绕原点旋转

#include <gl/glut.h> 

void OnKeyPress(unsigned char key, int x, int y)
{
if (key == 27)
exit(0);
switch(key)
{
case 'r':
case 'R':
// trick start here *********************
glTranslatef(-60,-20,0);
glRotatef(10, 0, 0, 1);
glTranslatef(60, 20, 0);
glutPostRedisplay();
break;
};
}

void OnDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(0.0f,0.5f,1.0f);

glBegin(GL_TRIANGLES);
glVertex2f(20, 20);
glVertex2f(60, 20);
glVertex2f(20, 100);
glEnd();
glFlush();
}

int main( int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 600);
glutCreateWindow("OpenGL Lab1" );
glutDisplayFunc(OnDisplay);
glutKeyboardFunc(OnKeyPress);

glClearColor(1.0, 1.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-100, 100, -100, 100);

glutMainLoop();

return 0;
}

最佳答案

您需要切换 glTranslate 调用的顺序,因为最后完成的转换是第一个应用于顶点的转换。看,每个变换都是一个矩阵,您当前的矩阵乘以该矩阵。然后将生成的矩阵乘以顶点以确定其最终位置。

如果你有:

 glTranslatef(-60,-20,0); (T1)
glRotatef(10, 0, 0, 1); (R)
glTranslatef(60, 20, 0); (T2)

并且还存储了前一帧的旧矩阵 Mo,您将拥有:

 M = (((Mo * T1) * R) * T2)

最后,这个M乘以每个顶点Vo,确定它的最终位置:

 V = M * Vo

矩阵乘法是不可交换的,但它们是结合的,因此括号顺序无关紧要,所有这些变换在数学上等价于:

 V = Mo * T1 * R * (T2 * Vo)

请注意,(T2 * Vo) 是由 T2(您的最后一个翻译)变换的顶点。如果我们称之为 V1,我们有:

 V = Mo * T1 * (R * V1)

看到 V1,即由 T2 变换的原始顶点,现在又被 (R * V1) 中的旋转 R 变换,导致另一个顶点,现在平移然后旋转。继续从右到左求解表达式,您将以与它们在 OpenGL 代码中“调用”的位置相反的顺序将所有变换应用到顶点。

我假设你知道为什么你必须翻译-旋转-取消翻译才能围绕你想要的点旋转,但是当你说“东西”在你的代码中围绕原点旋转时你错了.事实上,如果您注意的话,您会注意到它正在围绕点 (-60, -20) 旋转。

最后,您没有使用模型- View 矩阵,而是使用透视矩阵进行所有转换(顺便说一句,因为您没有像大多数应用程序那样每帧都重置它)。你不应该这样做,而是使用 GL_MODELVIEW 来进行这些类型的转换。尝试使用以下方法完成初始化函数:

...
Set_Transformations();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glutMainLoop();
}

关于c++ - OpenGL,围绕一个点的旋转仍然围绕原点不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9795607/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com