我的代码如下工作:绘制一个三角形,然后当点击"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;
Run Code Online (Sandbox Code Playgroud)
主要方法
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();
}
Run Code Online (Sandbox Code Playgroud)
显示方法
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();
}
Run Code Online (Sandbox Code Playgroud)
键盘事件
void MyKeyboard(unsigned char key,int mouseX,int mouseY)
{
if (key == '1')
{
glScaled (0.5f ,0.5f ,1.0f);
glutPostRedisplay();
return;
}
Run Code Online (Sandbox Code Playgroud)
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