如何"撤消"旋转以获得适当的缩放?

时间:2013-03-09 18:23:31

标签: math opengl matrix

我正在尝试从投影矩阵计算缩放百分比。只要图像未旋转,以下代码就可以工作:

void UpdateZoomPercent()
{
    var zoom = _projMatrix.M11 * glControl.Width / 2; // M11 is the top left value
    lblZoomPercent.Text = (zoom * 100).ToString("G3") + "%";
}

基本上它只需要X比例,然后将其乘以视口。 X和Y总是按比例缩放,所以我不需要看Y.我的场景是2D。

如何考虑轮换?

1 个答案:

答案 0 :(得分:2)

考虑形成笛卡尔坐标系基础的实数值矩阵。每列代表一个基本向量。在等角变焦的情况下,所有基矢量具有相同的长度。设C(M,n)表示矩阵M的第n列向量,即C(M,n)= M_n,j,然后对于等长变焦,它将是len(C(M,0))= len( C(M,1))= len(C(M,...)),其中len(v)= sqrt(v·v)

在不等轴缩放的情况下,基矢量的长度会有所不同,这可以用来检测这种情况。

在计算机图形学中,您遇到的矩阵是同质,以允许单个矩阵表示它们所代表的空间内的所有可能的变换。均匀矩阵具有N + 1行和列,其中N是由它们表示的坐标空间的维数。按照惯例(至少在所有流行的计算机图形软件中),左上部分(即M_i,j,其中i和j在1 ... N,1为基础的索引中)形成基本向量,而第N列和行形成同质部分

因此,在OpenGL的情况下,您将左上角的3×3子矩阵视为坐标基矢量。而且由于OpenGL索引列主要顺序,因此您无需重新排序从OpenGL检索的内容。