我正试图从投影矩阵中计算缩放百分比。只要图像没有旋转,下面的代码就可以工作:
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的。
我如何考虑旋转?
考虑构成直角坐标系基底的实值矩阵。每一列表示一个基向量。在等距缩放的情况下,所有基向量都具有相同的长度。设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行和1列,其中N是由它们表示的坐标空间的维数。根据惯例(至少在所有流行的计算机图形软件中),左上角的部分(即M_i,j,其中i和j在1…N, 1的索引中)构成基向量,而第N列和第N行构成齐次部分。
在OpenGL的情况下,你会把左上角的3×3子矩阵看作坐标基向量。由于OpenGL索引列的主要顺序,你不需要重新排序从OpenGL中检索到的内容。