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

分享到:

2012-11-28 23:50

浏览 1219

评论

发表评论

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

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

  1. SpringMVC源码分析_框架原理图

                                                                                 SpringMVC源码分析_框架原理图     ...

  2. tomcat源码分析_百战卓越108天tomcat和servlet源码分析

    训练大纲(第105天) 大家如果想快速有效的学习,思想核心是"以建立知识体系为核心",具体方法是"守破离".确保老师课堂上做的操作,反复练习直到熟练. 第209 ...

  3. 第4课第4节_Android灯光系统_源码分析_电池灯

    电池的监听器: Android灯光系统的源码分析与使用 4. 电池灯 a. batteryPropertiesRegistrar.registerListener(new BatteryListene ...

  4. vuex 源码分析_深入Vuex原理(上)

    原标题:深入Vuex原理(上) 孔维国,2016年加入去哪儿网技术团队.目前在大住宿事业部/增值业务研发中心,参与开发了TMC.CRM.QTA.Auth等项目,负责node框架nomi的设计以及开发. ...

  5. vuex 源码分析_前端入门之(vuex-router-sync解析)

    前端入门之(vuex-router-sync解析) 发布时间:2018-11-14 13:31, 浏览次数:513 , 标签: vuex router sync 前言:vue全家桶的内容我们已经研究过 ...

  6. CloudCompare源码分析_八叉树(Octree)算法基础CC中的八叉树结构

    官方参考地址:CloudCompare octree - CloudCompareWiki CC的octree算法主要体现在DgmOctree.h和DgmOctree.cpp中,他采用了一种分级的结构 ...

  7. 大数据_MapperReduce_Hbase_批处理batchMutate源码分析_数据的写入流程源码分析---Hbase工作笔记0032

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 我们知道hbase是用java语言编写的,所以我们再来看一下源码: 然后我们再去看一下这个batc ...

  8. MapReduce源码分析_李孟_新浪博客

    job.waitForCompletion(true);进入源码 submit()-> connect();连接,客户端获取服务端的代理对象 connect()->new Cluster( ...

  9. java asm源码分析_探究CAS原理(基于JAVA8源码分析)

    比较并替换,实现并发算法时常用到的一种技术,在java同步器中大量使用了CAS技术,神奇的实现了多线程执行的安全性 思想很简单:三个参数一个当前内存值V 旧的预期值A 即将更新的值B 当且仅当预期值A ...

最新文章

  1. 【引用】在Eclipse中将java Project转换成Dynamic Web Project
  2. 【java 性能优化实战】3 工具实践:如何获取代码性能数据?
  3. 《个体软件过程》—第1章1.1节什么是软件工程
  4. 为什么发了个博客分分钟被各种网站花式转载=。=而不通知我
  5. T-SQL里数据库工程师都不知道的秘密之SQL Server自定义函数UDF
  6. Android转载一:Android文件命名规范
  7. [设计模式-行为型]命令模式(Command)
  8. Android Studio下JUnit单元测试
  9. Spring AOP实现及运行期调用原理分析
  10. 《数学建模算法与应用》方法概述
  11. 用粉红噪声煲机_解析什么是白噪和粉噪?耳机煲机用白噪好还是粉噪
  12. 全球及中国城市规划行业十四五建设方向与运营动态分析报告2022版
  13. Could not import the lzma module
  14. Opencv3.2各个模块功能详细简介(包括与Opencv2.4的区别)
  15. 在 M1/M2 芯片的Mac上安装最新原生 ruby 的超简单方法(无需rvm)
  16. 计算机平面设计评分标准,竞赛各专业评分标准.DOC
  17. 蓝盘绿盘黑盘红盘的区别
  18. postman 9.16 打不开怎么办
  19. 读《应试教育的死穴,恰在于堵死了孩子“犯错”的空间》有感
  20. BIM——建筑信息模型 工程造价培训班

热门文章

  1. python3.8对应django版本_Python Django 版本对应表
  2. vue watch 修改滚动条_Vue.js 中滚动条始终定位在底部的方法
  3. 路由包含#号导致的nginx_分布式实战:Nginx缓存之OpenResty部署
  4. 设计灵感|教会你海报设计套路
  5. kettle 批量多表同步_财务基础数据同步的方式
  6. QJsonObject与QString的相互转换(处理了中文乱码)
  7. [译] Cilium:BPF 和 XDP 参考指南(2021)
  8. Linux内核:VFIO Mediated Device(vfio-mdev)内核文档(翻译)
  9. TCP/IP网络协议栈:IP协议
  10. 使用持久内存开发工具包 (PMDK) 创建持久内存感知队列