我面临着一个旋转问题,一个用opengl绘图图元绘制的三角形。我正在使用glut键功能,通过按E和R键来逆时针和顺时针旋转三角形。然后使用glut特殊键功能通过按up down left right键来平移三角形的x轴和y轴,如下所示

但在将这个三角形平移到另一个位置后,按下旋转键,它并不是从它停留的最后一个位置旋转。它是从中心原点旋转如何解决这个问题。

我不知道我做错了什么。
代码:
#include<iostream>
#include <cstdlib>
#include<GL\freeglut.h>
using namespace std;
float posX = 0.0f;
float posY = 0.0f;
float movethis = 0.1f;
float angle = 0.0f;
void init(void) {
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, -1.0);
}
void drawFigure() {
glPointSize(4);
glColor3f(1.0f, 1.0f, 0.0f);
glBegin(GL_LINES);
//Total 4 liens 9 vertex
glVertex2f(0.1f, 0.0f);
glVertex2f(-0.1f, 0.0f);
glVertex2f(0.0f, 0.1f);
glVertex2f(-0.1f, 0.0f);
glVertex2f(0.0f, 0.1f);
glVertex2f(0.1f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex2f(0.0f, 0.1f);
glVertex2f(0.0f, 0.0f);
glEnd();
glBegin(GL_POINTS);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex2f(0.0f, 0.1f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(0.0f, 0.0f);
glEnd();
}
void SpecialKeys(int key, int xpos, int ypos) {
if (key == GLUT_KEY_UP) {
posY = posY + movethis;
}
else if (key == GLUT_KEY_DOWN) {
posY = posY - movethis;
}
else if (key == GLUT_KEY_RIGHT) {
posX = posX + movethis;
}
else if (key == GLUT_KEY_LEFT) {
posX = posX - movethis;
}
glutPostRedisplay();
}
void KeysFun(unsigned char key, int xpos, int ypos) {
if (key == 'e' || key == 'E') {
angle=angle+10;
}
else if (key == 'r' || key == 'R') {
angle=angle-10;
}
glutPostRedisplay();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(angle, 0.0f, 0.0f, 1.0f);
glTranslatef(posX, posY, 0.0f);
drawFigure();
glFlush();
}
int main(int argc, char**argv) {
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitWindowPosition(450, 50);
glutCreateWindow("Frame");
init();
glutDisplayFunc(display);
glutSpecialFunc(&SpecialKeys);
glutKeyboardFunc(&KeysFun);
glutMainLoop();
return EXIT_SUCCESS;
}发布于 2016-03-23 23:51:14
你必须“倒着”阅读矩阵乘法链中的操作顺序。你首先需要旋转,然后平移,但是如果你写成
rotate
translate
vertices数据“向上”移动,因此顶点首先“看到”平移,然后“看到”旋转。解决方案:颠倒旋转和平移的顺序。
https://stackoverflow.com/questions/36166372
复制相似问题