2012-09-26 2 views
0

Мой код работает следующим образом: Треугольник рисуется, а затем, когда «1» нажата, треугольник масштабируется, но случается так, что треугольник масштабируется и переводится.Масштабирование в opengl

Вот мой код: глобальные переменные

#include <glut.h> 

void Display(void); 
void MyKeyboard(unsigned char,int,int); 
void MyMouse(int,int,int,int); 

int x1 =20 .0f; 
int y1 = 30.0f; 
int x2 = 40.0f; 
int y2 = 50.0f; 
int x3 = 60.0f; 
int y3 = 10.0f; 

основной метод

void main(int argc,char** argr) 
{ 
glutInit(&argc,argr); 
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); 
glutInitWindowSize(1000,600); 
glutInitWindowPosition(50,50); 
glutCreateWindow("Mouse and Keyboard"); 
glutDisplayFunc(Display); 
glutKeyboardFunc(MyKeyboard); 
glutMouseFunc(MyMouse); 
glClearColor(0.0f,0.0f,0.0f,0.0f); 
gluOrtho2D(0.0,1000.0,0.0,600.0); 
glutMainLoop(); 
} 

метод отображения

void Display() 
{ 
glClear(GL_COLOR_BUFFER_BIT); 
glPushMatrix(); 

    glBegin(GL_TRIANGLES); 
    glColor3f(0.0f,0.0f,1.0f); 

    glVertex3f(x1, 600-y1, 0.0f); 
    glVertex3f(x2, 600-y2, 0.0f); 
    glVertex3f(x3, 600-y3, 0.0f); 

    glEnd(); 
    glPopMatrix(); 
    glFlush(); 
} 

событие клавиатуры

void MyKeyboard(unsigned char key,int mouseX,int mouseY) 
{ 
    if (key == '1') 
    { 
     glScaled (0.5f ,0.5f ,1.0f); 
     glutPostRedisplay(); 
     return; 
    } 

ответ

1

Если вы хотите пропорционально масштабировать треугольник, а затем использовать:

glScaled (0.5f ,0.5f ,0.5f); 
+0

ничего не изменилось, треугольник масштабируется, но сдвинутый (перевод) – ahmed

+0

мне это нужно, чтобы оставаться в своей позиции – ahmed

7

glScaled() существенно привести все ваши вопросы, которые необходимо умножить на значения, которые вы поставляете glScaled(). Это в основном означает, что все ваши вершины будут удаляться от начала координат (0,0). Чтобы преодолеть проблему масштабирования, просто определите, какой треугольник будет центрирован (0,0).

Очевидно, что вы не всегда хотите, чтобы ваш треугольник был на нуле, поэтому вам нужно использовать функции glTranslate().

В идеале вы, вероятно, захотите изменить свою функцию клавиатуры, чтобы она вообще не вызывала glScale(), но хранит, сколько должно быть масштабировано в некоторой переменной. Затем, в цикле рендеринга, перед рисованием треугольника вызовите функции перевода и масштабирования.

Вне темы: Непосредственный режим OpenGL устарел (то есть glBegin(); glEnd()). Посмотрите здесь для современного OpenGL учебник ..

http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html

+0

может привести пример со значениями и числами пожалуйста ? – ahmed

Смежные вопросы