【发布时间】:2016-07-10 01:08:25
【问题描述】:
我正面临一个旋转问题,即使用 opengl 绘图原语绘制的三角形。我正在使用 glut 键功能通过按E 和R 键来逆时针和顺时针旋转三角形。然后还使用 glut 特殊键功能通过按updownleftright这样的键来平移三角形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;
}
【问题讨论】:
-
我最近回答了一个问题,我认为这与您遇到的问题相同:OpenGL object doesn't translate to rotation axis(另外,请阅读 cmets 了解有关编辑的上下文)
-
@aslg 我看到了那个答案,但这不是明确的答案
-
您需要将旋转放置在翻译之后。
-
如果您认真考虑使用像 OpenGL 这样的低级图形 API,那么学习矩阵变换的数学知识对您大有裨益。特别是:所有基本变换矩阵都围绕原点进行操作,但您可以将矩阵相乘以创建更复杂的变换。
-
@MannDeep 我明白了。您是该问题中的同一个人,只是在不同的帐户下。我仍然认为我的回答相当明确。你应该用谷歌搜索向量。