opengl 旋转基于规格化设备坐标的视图时,如何校正纵横比?

6qfn3psc  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个OpenGL 2D图形显示器。显示器使用标准化设备坐标(即水平方向为-1到+1,垂直方向为-1到+1,原点在视图中心)。我可以使用鼠标对视图中显示的对象进行平移和放大/缩小。
现在几乎所有的计算机显示器都具有非正方形的宽高比(例如16:9的宽高比)。因此,-1到+1的间距在垂直方向上比在水平方向上占据更小的物理距离。当从水平对准旋转到指向垂直方向时,线或等间隔点的线将在物理上看起来较短。
如何旋转视图并动态修正视图的非方形纵横比?以便线从水平对齐旋转为垂直对齐时在显示中保持相同的长度,从而导致线的一部分看起来被图幅“剪裁”。

vwkv1x7d

vwkv1x7d1#

假设视口大小为(w,h),设置一个投影矩阵,将像素坐标转换为NDC:

[ 2/w  0  0 -1 ]
P = [ 0   2/h 0 -1 ]
    [ 0    0  1  0 ]
    [ 0    0  0  1 ]

(This可以将左下角赋值为(0,0),右上角赋值为(w,h),如果愿意,也可以使用glm::ortho。)
将其传递给顶点着色器,并在模型视图矩阵之后应用它:

in vec4 position;
uniform mat4 P;
uniform mat4 MV;
void main() {
    gl_Position = P * MV * position;
}

现在你可以用像素来指定你所有的位置。当你在MV中应用旋转时,它会在平移到NDC之前旋转像素位置,从而保持你的2D模型的纵横比。

相关问题