skia 源码分析_【脚下有根】之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倍。
分享到:
2012-11-28 23:50
浏览 1219
评论
发表评论
文章已被作者锁定,不允许评论。
skia 源码分析_【脚下有根】之Skia库的matrix代码解读相关推荐
- SpringMVC源码分析_框架原理图
SpringMVC源码分析_框架原理图 ...
- tomcat源码分析_百战卓越108天tomcat和servlet源码分析
训练大纲(第105天) 大家如果想快速有效的学习,思想核心是"以建立知识体系为核心",具体方法是"守破离".确保老师课堂上做的操作,反复练习直到熟练. 第209 ...
- 第4课第4节_Android灯光系统_源码分析_电池灯
电池的监听器: Android灯光系统的源码分析与使用 4. 电池灯 a. batteryPropertiesRegistrar.registerListener(new BatteryListene ...
- vuex 源码分析_深入Vuex原理(上)
原标题:深入Vuex原理(上) 孔维国,2016年加入去哪儿网技术团队.目前在大住宿事业部/增值业务研发中心,参与开发了TMC.CRM.QTA.Auth等项目,负责node框架nomi的设计以及开发. ...
- vuex 源码分析_前端入门之(vuex-router-sync解析)
前端入门之(vuex-router-sync解析) 发布时间:2018-11-14 13:31, 浏览次数:513 , 标签: vuex router sync 前言:vue全家桶的内容我们已经研究过 ...
- CloudCompare源码分析_八叉树(Octree)算法基础CC中的八叉树结构
官方参考地址:CloudCompare octree - CloudCompareWiki CC的octree算法主要体现在DgmOctree.h和DgmOctree.cpp中,他采用了一种分级的结构 ...
- 大数据_MapperReduce_Hbase_批处理batchMutate源码分析_数据的写入流程源码分析---Hbase工作笔记0032
技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 我们知道hbase是用java语言编写的,所以我们再来看一下源码: 然后我们再去看一下这个batc ...
- MapReduce源码分析_李孟_新浪博客
job.waitForCompletion(true);进入源码 submit()-> connect();连接,客户端获取服务端的代理对象 connect()->new Cluster( ...
- java asm源码分析_探究CAS原理(基于JAVA8源码分析)
比较并替换,实现并发算法时常用到的一种技术,在java同步器中大量使用了CAS技术,神奇的实现了多线程执行的安全性 思想很简单:三个参数一个当前内存值V 旧的预期值A 即将更新的值B 当且仅当预期值A ...
最新文章
- 【引用】在Eclipse中将java Project转换成Dynamic Web Project
- 【java 性能优化实战】3 工具实践:如何获取代码性能数据?
- 《个体软件过程》—第1章1.1节什么是软件工程
- 为什么发了个博客分分钟被各种网站花式转载=。=而不通知我
- T-SQL里数据库工程师都不知道的秘密之SQL Server自定义函数UDF
- Android转载一:Android文件命名规范
- [设计模式-行为型]命令模式(Command)
- Android Studio下JUnit单元测试
- Spring AOP实现及运行期调用原理分析
- 《数学建模算法与应用》方法概述
- 用粉红噪声煲机_解析什么是白噪和粉噪?耳机煲机用白噪好还是粉噪
- 全球及中国城市规划行业十四五建设方向与运营动态分析报告2022版
- Could not import the lzma module
- Opencv3.2各个模块功能详细简介(包括与Opencv2.4的区别)
- 在 M1/M2 芯片的Mac上安装最新原生 ruby 的超简单方法(无需rvm)
- 计算机平面设计评分标准,竞赛各专业评分标准.DOC
- 蓝盘绿盘黑盘红盘的区别
- postman 9.16 打不开怎么办
- 读《应试教育的死穴,恰在于堵死了孩子“犯错”的空间》有感
- BIM——建筑信息模型 工程造价培训班
热门文章
- python3.8对应django版本_Python Django 版本对应表
- vue watch 修改滚动条_Vue.js 中滚动条始终定位在底部的方法
- 路由包含#号导致的nginx_分布式实战:Nginx缓存之OpenResty部署
- 设计灵感|教会你海报设计套路
- kettle 批量多表同步_财务基础数据同步的方式
- QJsonObject与QString的相互转换(处理了中文乱码)
- [译] Cilium:BPF 和 XDP 参考指南(2021)
- Linux内核:VFIO Mediated Device(vfio-mdev)内核文档(翻译)
- TCP/IP网络协议栈:IP协议
- 使用持久内存开发工具包 (PMDK) 创建持久内存感知队列