【发布时间】:2016-03-14 06:54:50
【问题描述】:
我在 2d 旋转中遇到问题。使用opengl绘制原语GL_LINES绘制三角形。
场景是我想使用E 和R 键来旋转这个三角形,并通过按up down left right 箭头键沿其旋转轴平移这个三角形。
但是现在三角形是旋转的,但不会沿着它的旋转轴平移。例如,简单来说,当用户按下向上箭头键时,我将对象旋转 90 度角,它不会将该三角形转换为 90 度角,它只是将其平移对象简单上下我被困在这个上面。
这是我的代码:
#include<iostream>
#include <cstdlib>
#include<GL\freeglut.h>
using namespace std;
float posX = 0.0f, posY = 0.0f, move_unit = 0.01f, 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() {
//LINES Make traingle
glColor3f(1.0f, 1.0f, 0.0f);
glBegin(GL_LINES);
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();
}
void SpecialKeys(int key, int xpos, int ypos) {
if (key == GLUT_KEY_UP) {
if (posY < 0.95f) {
posY += move_unit;
}
}
else if (key == GLUT_KEY_DOWN) {
if (posY > -1.0f) {
posY -= move_unit;
}
}
else if (key == GLUT_KEY_RIGHT) {
if (posX < 0.95f) {
posX += move_unit;
}
}
else if (key == GLUT_KEY_LEFT) {
if (posX > -0.95f) {
posX = posX - move_unit;
}
}
glutPostRedisplay();
}
void KeysFun(unsigned char key, int xpos, int ypos) {
if (key == 'e' || key == 'E') {
angle++;
}
else if (key == 'r' || key == 'R') {
angle--;
}
glutPostRedisplay();
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(posX, posY, 0.0f);
glRotatef(angle, 0.0f, 0.0f, 1.0f);
drawFigure();
glPopMatrix();
glFlush();
}
int main(int argc, char**argv) {
glutInit(&argc, argv);
glutInitWindowSize(600, 600);
glutInitWindowPosition(450, 50);
glutCreateWindow("C");
init();
glutDisplayFunc(display);
glutSpecialFunc(&SpecialKeys);
glutKeyboardFunc(&KeysFun);
glutMainLoop();
return EXIT_SUCCESS;
}
【问题讨论】:
-
使用当前代码,您的对象围绕原点旋转,对吗?变换的常见顺序是 TRS,因此对象围绕自身旋转/缩放。但我不明白你想要达到什么目的以及有什么问题。你能显示一个 GIF 吗?
-
@aslg 我现在编辑我的问题,你明白了