OpenGL 2D перемещение и объект на 1 единицу

У меня есть несколько вопросов о том, как переместить объект нажатием клавиши. Все, что я хочу сделать, это нажать кнопку «вверх» на моей клавиатуре и заставить объект двигаться на одну единицу.

void display(){

//Clear Window
glClear(GL_COLOR_BUFFER_BIT);

glPushMatrix();
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.1, -0.2);
glVertex2f(-0.1, 0.2);
glVertex2f(0.1, 0.2);
glVertex2f(0.1, -0.2);
glEnd();
glPopMatrix();
glFlush();
}void keyboardListener(int key)
{
if( key == GLUT_KEY_UP)
{
glTranslatef(1.0, 0.0, 0.0);
glutPostRedisplay();
}
}

Чего не хватает или какую концепцию я не понимаю?

0

Решение

использовать этот:

#include <stdio.h>
#include <gl/glut.h>

GLfloat rotation = 90.0;
float posX = 0, posY = 0, posZ = 0;

void reshape(int width, int heigth){
/* window ro reshape when made it bigger or smaller*/

glMatrixMode(GL_PROJECTION);
glLoadIdentity();

//clip the windows so its shortest side is 2.0
if (width < heigth) {
glOrtho(-2.0, 2.0, -2.0 * (GLfloat)heigth / (GLfloat)width, 2.0 * (GLfloat)heigth / (GLfloat)width, 2.0, 2.0);
}
else{
glOrtho(-2.0, 2.0, -2.0 * (GLfloat)width / (GLfloat)heigth, 2.0 * (GLfloat)width / (GLfloat)heigth,2.0 , 2.0);
}
// set viewport to use the entire new window
glViewport(0, 0, width, heigth);
}

void rect(){
glBegin(GL_POLYGON);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.1, -0.2);
glVertex2f(-0.1, 0.2);
glVertex2f(0.1, 0.2);
glVertex2f(0.1, -0.2);
glEnd();

}

void display(){
//Clear Window
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glPushMatrix();
glTranslatef(posX,posY,posZ);
rect();
glPopMatrix();
glFlush();
}void init(){
// set clear color to black
glClearColor(0.0, 0.0, 0.0, 0.0);

// set fill color to white
glColor3f(1.0, 1.0, 1.0);

//set up standard orthogonal view with clipping
//box as cube of side 2 centered at origin
//This is the default view and these statements could be removed
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

}
float move_unit = 0.1f;
void keyboardown(int key, int x, int y)
{
switch (key){
case GLUT_KEY_RIGHT:
posX+=move_unit;;
break;

case GLUT_KEY_LEFT:
posX-=move_unit;;
break;

case GLUT_KEY_UP:
posY+=move_unit;;
break;

case GLUT_KEY_DOWN:
posY-=move_unit;;
break;

default:
break;
}
glutPostRedisplay();
}int main(int argc, char** argv){

//initialize mode and open a windows in upper left corner of screen
//Windows tittle is name of program

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0, 0);
glutCreateWindow("Practice 1");
glutDisplayFunc(display);
init();
glutSpecialFunc(keyboardown);
glutMainLoop();

}
1

Другие решения

Самый простой способ — сделать что-то подобное

float posX = 0, posY = 0, posZ = 0;

void display(){
glClear(GL_COLOR_BUFFER_BIT);
glTranslate(posX,posY,posZ);
drawPolygon();
//...
}void keyboardListener(int key){
if(key == GLUT_KEY_RIGHT){ posX++; }
else if(key == GLUT_KEY_LEFT){ posX--; }
//..similar for up/down
glutPostRedisplay();
}
0

Этот код рисует круг и перемещается влево, вправо, вверх или вниз при нажатии клавиши.

#include <cmath>
#include <stdio.h>
float posX = 0.01, posY = -0.1, posZ = 0;

void circ() {
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_TRIANGLE_FAN);
for (int i = 0; i <= 300; i++) {
angle = 2 * PI * i / 300;
x = cos(angle) / 20;
y = sin(angle) / 20;
glVertex2d(x, y);
}
glEnd();
}void display() {
glClearColor(1.0, 1.0, 1.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glPushMatrix();
glTranslatef(posX, posY, posZ);
circ();
glPopMatrix();

glutSwapBuffers();
}

**float move_unit = 0.02f;
void keyboardown(int key, int x, int y) {
switch (key) {
case GLUT_KEY_RIGHT:
posX += move_unit;
break;
case GLUT_KEY_LEFT:
posX -= move_unit;
break;
case GLUT_KEY_UP:
posY += move_unit;
break;
case GLUT_KEY_DOWN:
posY -= move_unit;
break;
default:
break;
}
glutPostRedisplay();
}**int main(int argc, char** argv) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowSize(600, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("Example");
glutDisplayFunc(display);
glutSpecialFunc(keyboardown);
glutMainLoop();
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector