关于3D的opengl投影矩阵有很多很棒的教程,但我没有做3D。我真的很难按照自己的喜好进行正交投影设置。
int width = 320; int height = 480;
我使用这些设置创建了一个视图投影矩阵。
//eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz//
matrix view = (0, 0, -20, 0, 0, -1, 0, 1, 0);
matrix projection = (0, width, 0, height, 1, 100);
glViewport(0, width, 0, -height);
创建此视图和投影矩阵并将它们传递给gpu。
然后我从-1,-1 to 1, 1
创建一个四边形,以便它的原点位于中心。
然后我为四边形制作一个比例矩阵,这样我就可以在屏幕上看到它。它呈现为一个完美的正方形,但当然glViewport或透视矩阵不应该是正方形。它应该是矩形的。
如何设置glViewport以及透视矩阵,以便保持宽高比。
例如,我现在的宽高比是宽度/高度。如何将它与投影矩阵和glviewport一起使用?@Reto可能是正确的,我正在过度思考这个但是opengl应用程序界面对我来说有点棘手。
修改 我画了一张图片,希望能帮助澄清事情。
假设我希望我的视口为320x480像素。我想要两种不同的缩放模式,我可以选择。保持固定的高度 宽度将增长以显示更多水平视图或固定宽度,增加高度以显示更垂直。
假设我设计了一个320x480左右的场景,我把所有东西都放在外面,我知道我想扩大宽度,但保持一个固定的高度。
如何使用我的宽高比中的glViewport和正交投影矩阵来实现这一目标?
答案 0 :(得分:5)
使用onthogonal投影时,您可以简单地将ortho矩阵视为在xy平面中定义一些轴对齐的2D矩形,它描述了场景的区域,该区域映射到视。如果该矩形的纵横比与视口的纵横比不匹配,则图像将相应地分散。
让我们使用以下定义:
V: aspect of the viewport:
V = viewport_width / viewport_height
P: aspect of the ortho projection:
P = (right - left) / (top - bottom)
O: aspect of some axis-aligned rectangle which is drawn
O = (x_max - x_min) / (y_max - y_min)
应用转换后,对象将在屏幕上显示宽高比O / P * V
。
通常,在谈到"保持宽高比"时,我们设置P == V
,以便V / P
在上面的公式中相互抵消,并且对象显示正好长宽比他们被画在眼睛里。
这已经完全是您的代码所带来的。:
然后我从
-1,-1 to 1, 1
创建一个四元组,以便它的原点位于中心。
那个 是一个正方形,我想知道在保留纵横比时你怎么能想到它会变成一个矩形。
从您的图像中可以清楚地看到,您感兴趣的对象是长宽比为2/3的矩形。因此,您还应将其绘制为具有此类宽高比的矩形。有多种方法可以实现这一目标。由于视口大小似乎是给定的,因此您可以调整O
或 P
或两者。
然而,对我而言,似乎你完全过分复杂了。如果我找到了你,你就会有一些设计空间" 320x480像素,这是您感兴趣的区域"无论视口大小是什么,您总是希望在屏幕上看到它。为此,您可以执行以下操作:
float target_width = 320.f;
float target_height = 480.f;
float A = target_width / target_height; // target aspect ratio
// ... calculate V as above
if (V >= A) {
// wide viewport, use full height
ortho(-V/A * target_width/2.0f, V/A * target_width/2.0f, -target_height/2.0f, target_height/2.0f, ...);
} else {
// tall viewport, use full width
ortho(-target_width/2.0f, target_width/2.0f, -A/V*target_height/2.0f, A/V*target_height/2.0f, ...);
}
现在,您可以在您的设计范围内工作"像素。在该示例中,始终可见范围将从(-160, -240)
到(160,240)`,如果您使用该坐标精确绘制矩形,它将匹配图像中的蓝色框,在任何视口中。如果您不希望原点位于中心,您当然可以翻译它。