opengl中如何使窗口大小改变时,图形的形状不发生变化?

本文介绍了如何在图形绘制中通过调整视口大小和使用二维观察函数,确保裁剪区域的纵横比与视口一致,从而在不同比例的窗口上保持图像的形状不变。通过实现代码示例展示了具体操作过程。

问题的关键在于设置裁剪区域的纵横比与视口的纵横比一致。

设置视口大小:

<span style="font-size:18px;">glViewport(GLint x,GLint y,GLsizei w,GLsizei h);</span>
(x,y)是视口距离窗口左下角的位置,(w,h)是视口的宽度和高度。

设置二维观察函数:

glOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GL double top);
锁定纵横比,注意这里为什么要加一个判断语句。比如当窗口的宽大于高时(w>h),裁剪区域只能设置将高扩大即:(-15.0/ratio,15.0/ratio),而不能设置将宽缩小(这样会使图像在w方向的部分显示不出来)

glViewport(0,0,w,h);
GLfloat ratio=(GLfloat)w/(GLfloat)h;
if(w<=h)//保持形状不变
		gluOrtho2D(-15.0,15.0,-15.0/ratio,15.0/ratio);
else
		gluOrtho2D(-15.0*ratio,15.0*ratio,-15.0,15.0);
具体代码:

#include <stdlib.h>
#include <GL/glut.h>
GLfloat v[3][3]={{-10.0,0.0,0.0},{10.0,0.0,0.0},{0.0,10.0,0.0}};
int num=5;
void reshape(GLsizei w,GLsizei h)
{
	GLfloat ratio=(GLfloat)w/(GLfloat)h;
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if(w<=h)//保持形状不变
		gluOrtho2D(-15.0,15.0,-15.0/ratio,15.0/ratio);
	else
		gluOrtho2D(-15.0*ratio,15.0*ratio,-15.0,15.0);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
}
void triangle(GLfloat* a,GLfloat* b,GLfloat* c)
{
	glVertex3fv(a);
	glVertex3fv(b);
	glVertex3fv(c);
}
void divide_triangle(GLfloat* a,GLfloat* b,GLfloat* c,int n)
{
	GLfloat ab[3],ac[3],bc[3];
	if(n>0)
	{
		for(int j=0;j<3;j++)
		{
			ab[j]=(a[j]+b[j])/2;
			ac[j]=(a[j]+c[j])/2;
			bc[j]=(b[j]+c[j])/2;
		}
		divide_triangle(a,ab,ac,n-1);
		divide_triangle(ab,b,bc,n-1);
		divide_triangle(ac,bc,c,n-1);
	}
	else triangle(a,b,c);
}
void display()
{	
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_TRIANGLES);
	divide_triangle(v[0],v[1],v[2],num);
	glEnd();
	glFlush();
}
void myInit()
{
	glClearColor(1.0,1.0,1.0,1.0);
	glColor3f(0.0,1.0,0.0);
	glViewport(0,0,500,500);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	gluOrtho2D(-15.0,15.0,-15.0,15.0);
	glMatrixMode(GL_MODELVIEW);
}
void main(int argc,char** argv)
{
	glutInit(&argc,argv);
	glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
	glutInitWindowSize(500,500);
	glutInitWindowPosition(0,0);
	glutCreateWindow("Sierpinski");
	glutReshapeFunc(reshape);
	glutDisplayFunc(display);
	myInit();
	glutMainLoop();
}

运行结果截图:



参考文献:《交互式计算机图形学》(第五版) Edward Angel等



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值