在opengl中缩放

时间:2012-09-26 12:53:21

标签: opengl scale

我的代码如下: 绘制一个三角形,然后当单击“1”时,三角形会缩放,但会发生的是三角形的缩放和平移。

这是我的代码: 全局变量

#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;
    }

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如果您想按比例缩放三角形,请使用:

glScaled (0.5f ,0.5f ,0.5f);