2012-09-26 151 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(),但存储多少应在某些变量中缩放。然后,在渲染循环中,在绘制三角形之前,调用translate和scale函数。

题外话:即时模式OpenGL已弃用(即,glBegin(); glEnd())。看看这里为一体的现代化的OpenGL教程..

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

+0

你可以举一个例子与价值观和数字请 ? – ahmed