1.一个空间坐标系A1由U,V 和Origin来表述。
其中U,代表横轴。V代表纵轴。Origin代表原点。[初始值与屏幕坐标相同]

2.另外一个空间坐标系A2由当前矩阵Matrix描述。

3.A1经过A2进行变换,变换后的值A3为新的坐标系下的值。

4.A4是另外一个新的坐标系,代表的是一个方锥形的投影。
  A3经过A4进行变换,得到一个新的矩阵A5.代表的是A1在视口中的矩阵标示。

观察点在0,0,-576 (fLocation.fZ 和 fObserver 是同一值,标示观察的位置)
向前的方向为 0,0,1  fAxis 标示观察方向
向上的方向为 0, -1, 0  fZenith标示相机向上的方向。

doUpdate方法中。
对fZenith和fAxis求了一次点积。然后通过以下方法对位置fZenith的坐标进行了调整

SkUnit3D    axis, zenith, cross;
         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);

然后对zenith 和 axis求了一次叉积。很明显,是再求相机朝右的方向。

SkUnit3D::Cross(axis, zenith, &cross);

最后,对这个相机针对观察点 fObserver。要进行一次平移变换。

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);

Skia的SkCamera.cpp的doUpdate() 算法。相关推荐

  1. skia库的3D变换研究

    skia库的3D坐标变换其实也是无奈之举.参照SKCamera.cpp: 首先,定义了一个虚拟相机: void SkCamera3D::reset() { fLocation.set(0, 0, -S ...

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

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

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

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

  4. 【OpenCV 4开发详解】Canny算法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. OpenCV3源代码目录解析(算法模块解析 和 示例目录解析)

    OpenCV3源代码文件夹sources: • 3rdparty: 包含第三方库,如用视频解码用的 ffmpeg.jpg.png.tiff 等图片的解码库. • apps: 包含进行 Haar 分类器 ...

  6. SSD算法 模板 匹配

    SSD算法 误差平方和算法(Sum of Squared Differences,简称SSD算法),也叫差方和算法.实际上,SSD算法与SAD算法如出一辙,只是其相似度测量公式有一点改动(计算的是子图 ...

  7. 基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法( ...

  8. java 图像刺绣算法_图像处理:OpenCV3源代码文件解析

    引言 结合冈萨雷斯的<数字图像处理>和Opencv3.0,学习图像处理算法有一段时间了,知道了函数怎么使用,但不知道opencv所用的函数源代码是如何编写的,"知其然,也要知其所 ...

  9. 【计算机视觉】opencv姿态解算6 理论算法调研 PNP问题 5种算法

    关于PnP(pespective-n-point)的一些方法 最小PnP问题 P3P问题中假设没有噪声,使用几何约束,可以解得相机的位姿.不具有唯一解.  P4P问题中分为线性方法和基于P3P的方法. ...

最新文章

  1. GlideApp 引入不了问题
  2. 云计算正在告别DIY时代 阿里云专有云挑起企业级市场大梁
  3. MyBatis插件使用--分页插件与性能拦截器
  4. python有哪些作用-python的函数有什么作用
  5. java打包后发布找不到jsp_eclipse中web项目部署以后jsp的java文件找不到问题(Tomcat配置serverlocations)...
  6. 告别ASP.NET操作EXCEL的烦恼(总结篇)
  7. 09基于对象编程风格
  8. (oracle)八、表
  9. 干货 | 深度文本分类综述(12篇经典论文)
  10. ELK详解(三)——Elasticsearch部署优化
  11. Solr 4.10.3 后台管理页面查询详解
  12. 点线面的意义_如何运用设计中的点线面?
  13. 浅析机关单位人力资源内部控制
  14. mysql2008怎么安装_SQL Server 2008如何安装及附加数据库?
  15. f1c100A运行linux,荔枝派 Nano 全志 F1C100s 编译运行 Linux 笔记
  16. RK3568平台开发系列讲解(安卓篇)PackageInstaller(应用安装)流程介绍
  17. 怎样任意裁剪图片?如何快速改变图片形状?
  18. 创业投资——创新工场
  19. echarts渐变色
  20. 阿里云视频点播+项目实战

热门文章

  1. php如何获取当前时间 格式化,PHP获取当前日期和时间格式化步骤
  2. python进程和线程_Python进程与线程知识
  3. java web里实现 mvc_MVC模式在Java Web应用程序中的实现
  4. git 在拉取代码的时候connect 谷歌报错_工具 | 手把手教你在VSCode中使用Git
  5. asp中如何输入html,ASP.NET中输入文本的HTML解析办法
  6. 模板方法(设计一个稳定的父类框架,框架中的有一些步骤是可变的,将可变的步骤子类中来实现)
  7. 记录一下python手动安装第三方库
  8. C++ cin.ignore()用法
  9. iOS自定义简易刷新视图(仿MJRefresh)
  10. USB HID report descriptor