`
daojin
  • 浏览: 694082 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

【脚下有根】之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倍。

 

     

分享到:
评论
发表评论

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

相关推荐

    skia 编译好的库(windows)

    预编译库文件的重要性在于,它们允许开发者无需从源代码开始编译Skia,就可以直接在自己的项目中集成Skia功能,节省了大量的时间和计算资源。这些库文件可能是分版本和配置的,例如,有用于不同CPU架构(如x86和x64...

    skia for windows 静态库

    使用静态库有一些优点,比如避免了运行时库文件缺失导致的问题,以及确保了应用程序在不同系统上的行为一致性。然而,这也可能导致最终可执行文件的大小增加,因为包含了库的所有代码。 要使用这个静态库,开发者...

    Skia图形库SDK,带头文件和静态lib(x86)解压共1.8GB

    使用Skia图形库时,开发者需要了解C++编程语言,并且对图形渲染原理有一定的理解。在Windows环境下,配合Microsoft Visual Studio 2017进行开发,可以利用其IDE的强大调试和代码管理功能,提升开发效率。 为了充分...

    Skia静态库-自己生成的

    自己生成的skia静态库,包括core的全部

    skia描画库实例

    在`main.cpp`文件中,导入Skia库的头文件,并编写基本的Skia绘图代码。例如,你可以创建一个`SkCanvas`对象,使用`drawRect`函数绘制一个矩形。 ```cpp #include "SkPaint.h" #include "SkSurface.h" #include ...

    skia库-linux

    skia库,包含主要的类和功能。

    .net UI类..基于skia库形图的ppc类

    .NET UI 类库是用于构建用户界面的框架,而“基于Skia库形图的ppc类”则是在掌上电脑(PPC)平台上利用Skia图形库开发的UI组件。Skia是一个开源的2D图形处理库,由Google维护,被广泛应用于Android、Chrome、Firefox...

    skia-编译好的库和代码

    里面有两个工程,一个是skia编译好的工程(包括skia工程和Android),Android里面包含有skia的环境。用eclipse就可以编译,同时里面有一个cario的工程,里面编译好一个例子,运行就可以,看到图片的输出。

    Windows环境VS2017编译skia库-m84之已编译的库文件等

    Windows环境VS2017编译skia库-m84之已编译的库文件等 附件里面有已编译的x64和x86的库文件和头文件; 还有若干demo案例,有控制台的案例,也有和Qt结合的案例。 编译教程博客:...

    Google Skia图形库MingW, MSVC2017 64Bit编译库

    Google Skia图形库是一款强大的2D图形处理引擎,由Google开发并开源,广泛应用于Chrome、Android等项目。它提供高效、高性能的图形渲染能力,支持矢量图形、文本布局、图像滤镜等功能,且跨平台兼容性优秀。本文将...

    skia.rar(2D图形库)

    这个“skia.rar”压缩包很可能包含了Skia图形库的源代码、头文件、构建脚本以及其他相关资源,使得开发者能够在其项目中集成和使用Skia进行2D图形渲染。 Skia提供了丰富的API,支持多种硬件加速技术,以实现高效的...

    android skia

    在 Android 源代码库中,Skia 引擎的头文件位于 android/external/skia/include,源代码则位于 android/external/skia/src。为了便于 Java 代码调用,Android 对 Skia 进行了封装,相关代码分布在 android/framework...

    Google Skia 2D渲染引擎 最新版本 编译库

    Skia在多个领域有广泛的应用,包括: - 移动应用:Android系统使用Skia进行UI渲染和动画效果。 - 浏览器:Chrome浏览器使用Skia作为其渲染引擎的一部分,负责网页的2D图形和文本渲染。 - 游戏开发:游戏开发者可以...

    cpp-Skia来自Google用于绘制文字图形和图像的完整的2D图形库

    Skia,源自Google,是一个强大的开源2D图形库,它为开发者提供了绘制文字、图形和图像的全面功能。Skia广泛应用于多个操作系统和平台,包括Android、Chrome、Chrome OS、Firefox for Android等,以及各种嵌入式系统...

    skia所需zlib静态库

    skia zlib 静态库

    Skia绘图教程

    Skia是一款功能强大且高效的2D向量图形处理函数库,广泛应用于Google Chrome浏览器和Android开放手机平台等领域。Skia提供了字型、坐标转换、点阵图等多种图形处理功能,并且具有高效能且简洁的表现。 Skia绘图教程...

    Skia4Delphi-20220427.zip

    1. **跨平台兼容性**:由于Skia4Delphi是基于Skia库构建的,因此它能够无缝地在多个操作系统上运行,让开发者能够编写一次代码,到处运行。 2. **高效渲染**:Skia4Delphi提供了高级的2D渲染功能,如路径绘制、文本...

    Windows环境VS2017编译skia库-m84,亲测成功,使用官方编译的方法

    Windows环境VS2017编译skia库-m84,亲测成功,使用官方编译的方法。 附件是配套资源:gn和ninja工具 编译教程博客:https://libaineu2004.blog.csdn.net/article/details/106175625

    从Android源代码中pull的Skia源代码(C++)

    用git clone https://android.googlesource.com/platform/external/skia命令下载的android源码,用于ndk图形编程,由于google并没有把skia配置到ndk中,所以需要自己配置一下。由于国内对google的限制,花了两个晚上...

    skia zlib 静态库 vs2015

    skia zlib 静态库 vs2015

Global site tag (gtag.js) - Google Analytics