我面临一个旋转问题,一个用opengl绘图原语绘制的三角形。我正在使用过剩键功能通过按E
和R
键逆时针和顺时针旋转三角形。然后还使用过剩特殊键功能通过按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;
}
答案 0 :(得分:0)
您必须“向后”阅读矩阵乘法链中的运算顺序。您首先必须旋转,然后翻译,但如果您将其写为
rotate
translate
vertices
数据正在“向上”移动,因此顶点首先“看到”翻译,然后是旋转。解决方案:翻转旋转和平移的顺序。