openGl 重塑函数
Posted
技术标签:
【中文标题】openGl 重塑函数【英文标题】:openGl Reshape function 【发布时间】:2017-03-21 14:16:04 【问题描述】:谁能告诉我这段代码中 if-else 语句的意义何在?它到底是做什么的? 尤其是 glOrtho 中高除以宽的部分。
*如果该方法对任何人都模棱两可,这句话可能会有所帮助.. “这种重塑通过使视口和世界窗口具有相同的纵横比来保留形状”
void myReshape(int w, int h)
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (w <= h)
glOrtho(-50.0, 50.0, -50.0*(GLfloat)h / (GLfloat)w,
50.0*(GLfloat)h / (GLfloat)w, -1.0, 1.0);
else
glOrtho(-50.0*(GLfloat)w / (GLfloat)h,
50.0*(GLfloat)w / (GLfloat)h, -50.0, 50.0, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
提前谢谢!
【问题讨论】:
【参考方案1】:基本上这个想法是保持投影的长宽比为正方形(这就是 w
到 h
的划分)和在 XY 平面中的边长为 100 的正方形(世界空间单位)围绕选定的 XY 原点 (0,0) 适合窗口的 short 大小(这就是 if
的用途,以决定两个大小中的哪一个窗口是短尺寸)。
【讨论】:
【参考方案2】:纵横比可以通过两种不同的方式指定:
width/height
height/width
如果宽度大于高度,则width/height > 1
和height/width < 1
。
同样,如果高度大于宽度,width/height < 1
和 height/width > 1
如果屏幕的尺寸不相等,我们不能将投影的宽度和高度设置为相同的值。否则,一切都会显得捉襟见肘:
因此,我们将其中一个维度乘以纵横比。
如果纵横比大于 1,则应乘以更大的维度。
同样,如果纵横比小于 1,则应乘以较小的维度。
您的示例所做的是确保纵横比始终保持大于 1。
因此,它总是必须乘以更大的维度,这可能会有所不同。 这就是 if-else 的用途:
如果w <= h
(高度是更大的维度),纵横比乘以glOrtho();的顶部/底部参数
否则(h < w
,宽度是更大的维度),纵横比乘以glOrtho();的left/right参数
实际上,X 和 Y 维度(使用 if-else 情况)不能低于 100 个单位(-50 到 + 50) - 因为纵横比总是大于 1。
【讨论】:
真的,我感激不尽。你对我帮助很大。谢谢。 没问题,伙计。祝你进一步发展好运:)以上是关于openGl 重塑函数的主要内容,如果未能解决你的问题,请参考以下文章