OpenGL中的reshape函数(整理)

reshape函数怎么用
最佳答案
2010-11-30 回答
是不是问 OpenGL / GLUT 方面的问题?
GLUT里 glutReshapeFunc(reshape); 定义 当窗的形状改变事件发生时 调用的处理函数 reshape。
shape 是形状。reshape 是当形状改变时,做些什么来修正窗内的图形显示。
这由程序员自己决定,例如,你可以考虑图形长宽尺度按窗的长宽变化,按比例缩放。你也可以考虑图形长宽尺度不变,…
下面是一个例子:
void reshape(int cur_w, int cur_h)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if (cur_h <= 0) cur_h = 10; // 窗太小时处理
glViewport(0,0, cur_w, cur_h);
xfactor = (float) glutGet( GLUT_WINDOW_WIDTH ) / (float) img_width; // 按比例缩放
yfactor = (float) glutGet( GLUT_WINDOW_HEIGHT ) / (float) img_height; // 按比例缩放
glutPostRedisplay(); // 发送更新消息
}

最新回答 (1条回答)
2010-11-30 回答
你说的应该是改变窗口形状,所绘制的物体不变形,而只是大小发生变化是吧?
void reshape (int w, int h)
{
glviewport (0, 0, (glsizei) w, (glsizei) h);
glmatrixmode (gl_projection);
glloadidentity ();
if (w <= h)
gluortho2d (0.0, 30.0, 0.0, 30.0 * (glfloat) h/(glfloat) w);
else
gluortho2d (0.0, 30.0 * (glfloat) w/(glfloat) h, 0.0, 30.0);
glmatrixmode(gl_modelview);
}
看这个reshape函数当窗口发生变化,窗口的w(宽度)和h(高度)参数传给reshape函数,
glviewport (0, 0, (glsizei) w, (glsizei) h);
把视口设置为铺满整个窗口, if (w <= h)
gluortho2d (0.0, 30.0, 0.0, 30.0 * (glfloat) h/(glfloat) w);
else
gluortho2d (0.0, 30.0 * (glfloat) w/(glfloat) h, 0.0, 30.0);
把投影得到的视景体按照视口变化的比例变化视景体的比例;简单地说,本来视景体宽高比是1:1,视口宽高比也是1:1,这时绘制了一个物体。然后因为窗口发生变化,视口也变化,假如变成了2:1;这时如果用1:1的视景体放到2:1的视口上肯定会变形,所以要把视景体变成2:1,这样,虽然物体看起来变大(或变小)了,但长宽比例不变,也就看起来不变形了。注意这个参数(glfloat) w/(glfloat) h。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值