【脚下有根】之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顾名思义就是方位。但是上面的运算又是什么意思呢。很多线性代数不好的同学,或者线性代数很好的同学,都不知道。究其原因就是不能理论联系实际。这是中国人大学生的通病。
废话少说,解释一下。
[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倍。
【脚下有根】之Skia库的matrix代码解读相关推荐
- skia 源码分析_【脚下有根】之Skia库的matrix代码解读
先插入一段代码,然后对这段代码进行解释.网上很多地方讲解了如何进行绕x轴,y轴旋转产生3D效果.但是没有任何人对矩阵的算法进行剖析.本文档对其算法进行解释. void SkCamera3D::doUp ...
- skia库的3D变换研究
skia库的3D坐标变换其实也是无奈之举.参照SKCamera.cpp: 首先,定义了一个虚拟相机: void SkCamera3D::reset() { fLocation.set(0, 0, -S ...
- Skia深入分析10——Skia库的性能与优化潜力
Skia库性能与优化潜力 图形/渲染 算法/架构 作为图形渲染引擎,性能上是非常重要的,按通常Android手机60帧的刷新率,绘制一帧的总时间只有16ms,可谓是毫厘必争.提升性能到最后,就必然跟不 ...
- Android编译Skia库
Android编译Skia库 本文档提供两种方法编译Skia库 使用aosp源码进行编译 使用skia源码进行编译 两种编译方法都可以编译,并且都可以使用在多个平台中,且可以使用在不同Android版 ...
- windows下编译skia库
windows下编译skia库 环境需求: 1.安装python2.7.x: python3系列可能又某些库不支持,所以推荐使用python2.7.15(最新). 如何检查是否安装python: 1. ...
- Windows版skia库的编译及下载(VS2019)
工作需要使用skia库,但是这个库的源代码不好访问,编译工具也是要科学访问才行,windows上自己编译一份很麻烦,可是网上找不到编译好的库...... 不对,至少能找到一份,但是居然它的debug版 ...
- Windows环境VS2017编译skia库-m84,亲测成功,使用官方编译的方法
环境准备 Windows7/10电脑需要能访问https://skia.org/和https://skia.googlesource.com/skia.git 在Windows上安装Visual St ...
- C/C++ 开源库及示例代码
C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1 ...
- [WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互
[WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互 原文:[WPF自定义控件库] 自定义控件的代码如何与ControlTemplate交互 1. 前言 WPF有一个灵活的 ...
最新文章
- Blender中的大师级3D环境场景制作学习教程
- 怎样设计一个商城项目?
- 1390 游戏得分(贪心)
- 2016年金融全行业网络安全状况调研报告
- 遮挡目标检测优化笔记
- 360安全卫士 导致MySQL 5.0.24 自动关闭
- 开源资讯- Jeecg 在线聊天MQ插件发布
- tiny服务器系列,项目:TinyHTTP服务器
- ip subnet-zero
- saltstack计划任务工具和其他命令
- Mac WebStorm 破解
- 财务部计算机操作规程,财务部操作规程.pdf
- PostgreSQL文本搜索(七)——自定义配置
- git入门-----远程操作相关命令(remote 、push、fetch 、pull)
- 51单片机:1602液晶显示屏
- A protocol for Dying
- 从小玩到大的铁哥们突然跟我表白,该怎么面对?
- 虚拟示波器-开天斧-STC8H8K64U核心功能实验板测试
- Mybatis学习一
- 服务器主板四路SLI时候出现的问题
热门文章
- minicom的按键控制_minicom使用指南
- kodi教程_KODI清理缓存插件安装设置教程
- 1.72java8_JDK 1.7 1.8 新特性
- opengl绘制长方体线框_OpenGL 绘制长方体 计算机图形学
- calico跨主机ping不通_戳穿 Calico 的谎言
- 2.MOC文件解读(上)——MOC文件中的数据
- mysql中group concat_mysql中group_concat()函数的使用方法总结
- 如何在geth中创建genesis.json_如何在Photoshop中应用“通道混合器”创建一个复古韵味色调...
- MySQL 表中添加 时间戳 字段
- 你需要知道的Android View的布局