【脚下有根】之Skia库的matrix代码解读

先插入一段代码,然后对这段代码进行解释。网上很多地方讲解了如何进行绕x轴,y轴旋转产生3D效果。但是没有任何人对矩阵的算法进行剖析。本文档对其算法进行解释。

void SkCamera3D::doUpdate() const {
    SkUnit3D    axis, zenith, cross;

    fAxis.normalize(&axis);

    {
        SkScalar dot = SkUnit3D::Dot(*(const SkUnit3D*)(const void*)&fZenith, axis);

        zenith.fX = fZenith.fX - SkUnitScalarMul(dot, axis.fX);
        zenith.fY = fZenith.fY - SkUnitScalarMul(dot, axis.fY);
        zenith.fZ = fZenith.fZ - SkUnitScalarMul(dot, axis.fZ);

        (void)((SkPoint3D*)(void*)&zenith)->normalize(&zenith);
    }

	/*
		[-z, 0, x]   [cross.fX, 	cross.fY, 		cross.fZ]
		[0, -z, y]* [zenith.fx, 	zenith.fY, 	zenith.fZ]
		[0,  0,  1]  [axis.fx, 	axis.fY,   		axis.fZ]
	
	*/
    SkUnit3D::Cross(axis, zenith, &cross);

    {
        SkMatrix* orien = &fOrientation;
        SkScalar x = fObserver.fX;
        SkScalar y = fObserver.fY;
        SkScalar z = fObserver.fZ;

        orien->set(SkMatrix::kMScaleX, SkUnitScalarMul(x, axis.fX) - SkUnitScalarMul(z, cross.fX));
        orien->set(SkMatrix::kMSkewX,  SkUnitScalarMul(x, axis.fY) - SkUnitScalarMul(z, cross.fY));
        orien->set(SkMatrix::kMTransX, SkUnitScalarMul(x, axis.fZ) - SkUnitScalarMul(z, cross.fZ));
        orien->set(SkMatrix::kMSkewY,  SkUnitScalarMul(y, axis.fX) - SkUnitScalarMul(z, zenith.fX));
        orien->set(SkMatrix::kMScaleY, SkUnitScalarMul(y, axis.fY) - SkUnitScalarMul(z, zenith.fY));
        orien->set(SkMatrix::kMTransY, SkUnitScalarMul(y, axis.fZ) - SkUnitScalarMul(z, zenith.fZ));
        orien->set(SkMatrix::kMPersp0, axis.fX);
        orien->set(SkMatrix::kMPersp1, axis.fY);
        orien->set(SkMatrix::kMPersp2, axis.fZ);
    }
}
 

 大家看了上面一段代码可能云里雾里。具体参照SkCamera.cpp。目录在android的 extern目录的libskia下。

  这个矩阵算出来的是orien。orien顾名思义就是方位。但是上面的运算又是什么意思呢。很多线性代数不好的同学,或者线性代数很好的同学,都不知道。究其原因就是不能理论联系实际。这是中国人大学生的通病。

   废话少说,解释一下。

       

[-z, 0, x]   [cross.fX,   cross.fY,   cross.fZ ]
[0, -z, y]* [zenith.fx, zenith.fY, zenith.fZ]
[0, 0, 1]    [ axis.fx,        axis.fY,     axis.fZ ]

 今天就到这里。明天继续。和明显x,y 表示的是偏移量。而-z,-z表示了放大缩小倍数。就相当于根据z的值,对原来的坐标系的沿着x,y方向进行放大z倍,然后平移到x,y。一般情况下,x=0,y=0,。因此,此函数就相当于放大了-z倍。

扫描二维码关注公众号,回复: 747077 查看本文章

     

猜你喜欢

转载自daojin.iteye.com/blog/1737858
今日推荐