skia 源码分析_【脚下有根】之Skia库的matrix代码解读

本文深入剖析Skia库中3D相机的doUpdate()函数,详细解释了矩阵运算的原理,涉及线性代数与坐标变换。通过代码分析,阐述了如何利用矩阵实现3D旋转和平移效果。
摘要由CSDN通过智能技术生成

先插入一段代码,然后对这段代码进行解释。网上很多地方讲解了如何进行绕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倍。

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-11-28 23:50

浏览 1219

评论

发表评论

文章已被作者锁定,不允许评论。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值